From d104dabd15773a7a7379bac461e0157d94f8e2be Mon Sep 17 00:00:00 2001 From: damithc <1673303+damithc@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:23:10 +0800 Subject: [PATCH] Site Update. [skip ci] --- _markbind/logs/markbind-2024-10-28.log | 627 ------------------ _markbind/logs/markbind-2024-11-04.log | 40 ++ _markbind/logs/markbind-2024-11-05.log | 4 + admin/appendixA-principles.html | 2 +- admin/appendixA-principles.page-vue-render.js | 2 +- admin/appendixB-policies.html | 2 +- admin/appendixB-policies.page-vue-render.js | 2 +- admin/appendixC-faq.html | 2 +- admin/appendixC-faq.page-vue-render.js | 2 +- admin/appendixD-help.html | 2 +- admin/appendixD-help.page-vue-render.js | 2 +- admin/appendixE-gitHub.html | 2 +- admin/appendixE-gitHub.page-vue-render.js | 2 +- admin/appendixF-teamworkIssues.html | 2 +- ...ppendixF-teamworkIssues.page-vue-render.js | 2 +- admin/appendixG-CS2103R.html | 2 +- admin/appendixG-CS2103R.page-vue-render.js | 2 +- admin/courseBriefings.html | 2 +- admin/courseBriefings.page-vue-render.js | 2 +- admin/courseExpectations.html | 2 +- admin/courseExpectations.page-vue-render.js | 2 +- admin/courseOverview.html | 2 +- admin/courseOverview.page-vue-render.js | 2 +- admin/exam-pen-and-paper.html | 2 +- admin/exam-pen-and-paper.page-vue-render.js | 2 +- admin/exams-f2f.html | 2 +- admin/exams-f2f.page-vue-render.js | 2 +- admin/exams.html | 2 +- admin/exams.page-vue-render.js | 2 +- admin/gradeBreakdown.html | 2 +- admin/gradeBreakdown.page-vue-render.js | 2 +- admin/index.html | 2 +- admin/index.page-vue-render.js | 2 +- admin/instructors.html | 2 +- admin/instructors.page-vue-render.js | 2 +- admin/ip-grading.html | 2 +- admin/ip-grading.page-vue-render.js | 2 +- admin/ip-overview.html | 2 +- admin/ip-overview.page-vue-render.js | 2 +- admin/ip-showcase.html | 2 +- admin/ip-showcase.page-vue-render.js | 2 +- admin/ip-w2.html | 2 +- admin/ip-w2.page-vue-render.js | 2 +- admin/ip-w3.html | 2 +- admin/ip-w3.page-vue-render.js | 2 +- admin/ip-w4.html | 2 +- admin/ip-w4.page-vue-render.js | 2 +- admin/ip-w5.html | 2 +- admin/ip-w5.page-vue-render.js | 2 +- admin/ip-w6.html | 2 +- admin/ip-w6.page-vue-render.js | 2 +- admin/ip-w7.html | 2 +- admin/ip-w7.page-vue-render.js | 2 +- admin/ip-w8.html | 2 +- admin/ip-w8.page-vue-render.js | 2 +- admin/lectures.html | 2 +- admin/lectures.page-vue-render.js | 2 +- admin/mid-semester-survey-results.html | 2 +- ...semester-survey-results.page-vue-render.js | 2 +- admin/overview-for-teachers.html | 2 +- .../overview-for-teachers.page-vue-render.js | 2 +- admin/participation.html | 2 +- admin/participation.page-vue-render.js | 2 +- admin/peerEvaluations.html | 2 +- admin/peerEvaluations.page-vue-render.js | 2 +- admin/programmingLanguages.html | 2 +- admin/programmingLanguages.page-vue-render.js | 2 +- admin/reposenseAuthorAnnotation.html | 2 +- ...posenseAuthorAnnotation.page-vue-render.js | 2 +- admin/standardsAndConventions.html | 2 +- ...standardsAndConventions.page-vue-render.js | 2 +- admin/teamList.html | 2 +- admin/teamList.page-vue-render.js | 4 +- admin/textbooks.html | 2 +- admin/textbooks.page-vue-render.js | 2 +- admin/tools.html | 2 +- admin/tools.page-vue-render.js | 2 +- admin/tp-common-fragments.html | 2 +- admin/tp-common-fragments.page-vue-render.js | 2 +- admin/tp-constraints.html | 2 +- admin/tp-constraints.page-vue-render.js | 2 +- admin/tp-deliverables.html | 2 +- admin/tp-deliverables.page-vue-render.js | 2 +- admin/tp-expectations.html | 2 +- admin/tp-expectations.page-vue-render.js | 2 +- admin/tp-grading.html | 2 +- admin/tp-grading.page-vue-render.js | 2 +- admin/tp-overview.html | 2 +- admin/tp-overview.page-vue-render.js | 2 +- admin/tp-pe.html | 2 +- admin/tp-pe.page-vue-render.js | 2 +- admin/tp-ped.html | 2 +- admin/tp-ped.page-vue-render.js | 2 +- admin/tp-supervision.html | 2 +- admin/tp-supervision.page-vue-render.js | 2 +- admin/tp-teams.html | 2 +- admin/tp-teams.page-vue-render.js | 2 +- admin/tp-timeline.html | 2 +- admin/tp-timeline.page-vue-render.js | 2 +- admin/tp-w10.html | 2 +- admin/tp-w10.page-vue-render.js | 4 +- admin/tp-w11.html | 2 +- admin/tp-w11.page-vue-render.js | 4 +- admin/tp-w12.html | 2 +- admin/tp-w12.page-vue-render.js | 2 +- admin/tp-w13.html | 4 +- admin/tp-w13.page-vue-render.js | 4 +- admin/tp-w2.html | 2 +- admin/tp-w2.page-vue-render.js | 2 +- admin/tp-w3.html | 2 +- admin/tp-w3.page-vue-render.js | 2 +- admin/tp-w4.html | 2 +- admin/tp-w4.page-vue-render.js | 2 +- admin/tp-w5.html | 2 +- admin/tp-w5.page-vue-render.js | 2 +- admin/tp-w6.html | 2 +- admin/tp-w6.page-vue-render.js | 2 +- admin/tp-w7.html | 2 +- admin/tp-w7.page-vue-render.js | 2 +- admin/tp-w8.html | 2 +- admin/tp-w8.page-vue-render.js | 2 +- admin/tp-w9.html | 2 +- admin/tp-w9.page-vue-render.js | 2 +- admin/tutorials.html | 2 +- admin/tutorials.page-vue-render.js | 2 +- admin/tutors-info.html | 2 +- admin/tutors-info.page-vue-render.js | 2 +- admin/usingThisWebsite.html | 2 +- admin/usingThisWebsite.page-vue-render.js | 2 +- admin/weeklySchedule.html | 2 +- admin/weeklySchedule.page-vue-render.js | 2 +- book/about/acknowledgements.html | 2 +- .../about/acknowledgements.page-vue-render.js | 2 +- .../clientServer/index.html | 2 +- .../clientServer/index.page-vue-render.js | 2 +- .../clientServer/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../eventDriven/index.html | 2 +- .../eventDriven/index.page-vue-render.js | 2 +- .../eventDriven/what/index.html | 2 +- .../eventDriven/what/index.page-vue-render.js | 2 +- .../architecturalStyles/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../architecturalStyles/more/index.html | 2 +- .../more/index.page-vue-render.js | 2 +- .../more/moreStyles/index.html | 2 +- .../more/moreStyles/index.page-vue-render.js | 2 +- .../more/usingStyles/index.html | 2 +- .../more/usingStyles/index.page-vue-render.js | 2 +- .../architecturalStyles/nTier/index.html | 2 +- .../nTier/index.page-vue-render.js | 2 +- .../architecturalStyles/nTier/what/index.html | 2 +- .../nTier/what/index.page-vue-render.js | 2 +- .../serviceOriented/index.html | 2 +- .../serviceOriented/index.page-vue-render.js | 2 +- .../serviceOriented/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../transactionProcessing/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../transactionProcessing/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../architectureDiagrams/drawing/index.html | 2 +- .../drawing/index.page-vue-render.js | 2 +- .../architectureDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../architectureDiagrams/reading/index.html | 2 +- .../reading/index.page-vue-render.js | 2 +- book/architecture/index.html | 2 +- book/architecture/index.page-vue-render.js | 2 +- book/architecture/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../architecture/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../basic/avoidEmptyCatchBlocks/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../basic/deleteDeadCode/index.html | 2 +- .../deleteDeadCode/index.page-vue-render.js | 2 +- .../basic/dontRecycleVarsOrParams/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../avoidShortcuts/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- .../basic/useDefaultBranch/index.html | 2 +- .../useDefaultBranch/index.page-vue-render.js | 2 +- book/codeQuality/avoidShortcuts/index.html | 2 +- .../avoidShortcuts/index.page-vue-render.js | 2 +- .../avoidShortcuts/intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../minimiseCodeDuplication/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../minimiseVariableScope/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../avoidShortcuts/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../basic/dontRepeatObvious/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../commentMinimally/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- .../basic/writeToReader/index.html | 2 +- .../writeToReader/index.page-vue-render.js | 2 +- book/codeQuality/commentMinimally/index.html | 2 +- .../commentMinimally/index.page-vue-render.js | 2 +- .../explainWhatWhyNotHow/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../commentMinimally/intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../commentMinimally/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../followStandard/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- book/codeQuality/followStandard/index.html | 2 +- .../followStandard/index.page-vue-render.js | 2 +- .../followStandard/intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../followStandard/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/codeQuality/index.html | 2 +- book/codeQuality/index.page-vue-render.js | 2 +- .../codeQuality/introduction/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- book/codeQuality/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../maximizeReadability/advanced/index.html | 2 +- .../advanced/index.page-vue-render.js | 2 +- .../makeHappyPathProminent/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../avoidComplicatedExpressions/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../basic/avoidDeepNesting/index.html | 2 +- .../avoidDeepNesting/index.page-vue-render.js | 2 +- .../basic/avoidLongMethods/index.html | 2 +- .../avoidLongMethods/index.page-vue-render.js | 2 +- .../basic/avoidMagicNumbers/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../maximizeReadability/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- .../basic/makeCodeObvious/index.html | 2 +- .../makeCodeObvious/index.page-vue-render.js | 2 +- .../maximizeReadability/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../avoidPrematureOptimizations/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../intermediate/dontTripReader/index.html | 2 +- .../dontTripReader/index.page-vue-render.js | 2 +- .../intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../intermediate/practiceKISSing/index.html | 2 +- .../practiceKISSing/index.page-vue-render.js | 2 +- .../intermediate/slapHard/index.html | 2 +- .../slapHard/index.page-vue-render.js | 2 +- .../structureCodeLogically/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/codeQuality/nameWell/basic/index.html | 2 +- .../nameWell/basic/index.page-vue-render.js | 2 +- .../basic/nounsAndVerbsAsNames/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../basic/useStandardWords/index.html | 2 +- .../useStandardWords/index.page-vue-render.js | 2 +- book/codeQuality/nameWell/index.html | 2 +- .../nameWell/index.page-vue-render.js | 2 +- .../avoidMisleadingNames/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../nameWell/intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../notTooLongNorShort/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../intermediate/useNameExplain/index.html | 2 +- .../useNameExplain/index.page-vue-render.js | 2 +- .../nameWell/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/combined/exercises.html | 2 +- book/combined/exercises.page-vue-render.js | 2 +- book/cppToJava/about/index.html | 2 +- book/cppToJava/about/index.page-vue-render.js | 2 +- .../classes/classLevelMembers/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../classes/definingClasses/index.html | 2 +- .../definingClasses/index.page-vue-render.js | 2 +- .../classes/gettersAndSetters/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/cppToJava/classes/index.html | 2 +- .../classes/index.page-vue-render.js | 2 +- .../collections/arrayListClass/index.html | 2 +- .../arrayListClass/index.page-vue-render.js | 2 +- .../collections/hashMapClass/index.html | 2 +- .../hashMapClass/index.page-vue-render.js | 2 +- book/cppToJava/collections/index.html | 2 +- .../collections/index.page-vue-render.js | 2 +- book/cppToJava/collections/what/index.html | 2 +- .../collections/what/index.page-vue-render.js | 2 +- .../controlFlow/branching/index.html | 2 +- .../branching/index.page-vue-render.js | 2 +- book/cppToJava/controlFlow/index.html | 2 +- .../controlFlow/index.page-vue-render.js | 2 +- book/cppToJava/controlFlow/loops/index.html | 2 +- .../loops/index.page-vue-render.js | 2 +- book/cppToJava/controlFlow/methods/index.html | 2 +- .../methods/index.page-vue-render.js | 2 +- book/cppToJava/dataTypes/arrays/index.html | 2 +- .../dataTypes/arrays/index.page-vue-render.js | 2 +- book/cppToJava/dataTypes/index.html | 2 +- .../dataTypes/index.page-vue-render.js | 2 +- book/cppToJava/dataTypes/operators/index.html | 2 +- .../operators/index.page-vue-render.js | 2 +- .../dataTypes/primitiveTypes/index.html | 2 +- .../primitiveTypes/index.page-vue-render.js | 2 +- book/cppToJava/dataTypes/variables/index.html | 2 +- .../variables/index.page-vue-render.js | 2 +- book/cppToJava/exceptions/how/index.html | 2 +- .../exceptions/how/index.page-vue-render.js | 2 +- book/cppToJava/exceptions/index.html | 2 +- .../exceptions/index.page-vue-render.js | 2 +- book/cppToJava/exceptions/what/index.html | 2 +- .../exceptions/what/index.page-vue-render.js | 2 +- book/cppToJava/generics/how/index.html | 2 +- .../generics/how/index.page-vue-render.js | 2 +- book/cppToJava/generics/index.html | 2 +- .../generics/index.page-vue-render.js | 2 +- book/cppToJava/generics/what/index.html | 2 +- .../generics/what/index.page-vue-render.js | 2 +- .../gettingStarted/compiling/index.html | 2 +- .../compiling/index.page-vue-render.js | 2 +- .../gettingStarted/helloWorld/index.html | 2 +- .../helloWorld/index.page-vue-render.js | 2 +- book/cppToJava/gettingStarted/index.html | 2 +- .../gettingStarted/index.page-vue-render.js | 2 +- .../gettingStarted/installation/index.html | 2 +- .../installation/index.page-vue-render.js | 2 +- .../gettingStarted/running/index.html | 2 +- .../running/index.page-vue-render.js | 2 +- book/cppToJava/index.html | 2 +- book/cppToJava/index.page-vue-render.js | 2 +- .../abstractClassesAndMethods/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/cppToJava/inheritance/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- book/cppToJava/inheritance/index.html | 2 +- .../inheritance/index.page-vue-render.js | 2 +- .../inheritance/interfaces/index.html | 2 +- .../interfaces/index.page-vue-render.js | 2 +- .../inheritance/objectClass/index.html | 2 +- .../objectClass/index.page-vue-render.js | 2 +- .../inheritance/polymorphism/index.html | 2 +- .../polymorphism/index.page-vue-render.js | 2 +- book/cppToJava/javaWorld/editions/index.html | 2 +- .../editions/index.page-vue-render.js | 2 +- book/cppToJava/javaWorld/how/index.html | 2 +- .../javaWorld/how/index.page-vue-render.js | 2 +- book/cppToJava/javaWorld/index.html | 2 +- .../javaWorld/index.page-vue-render.js | 2 +- book/cppToJava/javaWorld/what/index.html | 2 +- .../javaWorld/what/index.page-vue-render.js | 2 +- book/cppToJava/junit/basic/index.html | 2 +- .../junit/basic/index.page-vue-render.js | 2 +- book/cppToJava/junit/index.html | 2 +- book/cppToJava/junit/index.page-vue-render.js | 2 +- book/cppToJava/junit/intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../cppToJava/misc/accessModifiers/index.html | 2 +- .../accessModifiers/index.page-vue-render.js | 2 +- book/cppToJava/misc/casting/index.html | 2 +- .../misc/casting/index.page-vue-render.js | 2 +- book/cppToJava/misc/constants/index.html | 2 +- .../misc/constants/index.page-vue-render.js | 2 +- book/cppToJava/misc/enums/index.html | 2 +- .../misc/enums/index.page-vue-render.js | 2 +- book/cppToJava/misc/fileAccess/index.html | 2 +- .../misc/fileAccess/index.page-vue-render.js | 2 +- book/cppToJava/misc/index.html | 2 +- book/cppToJava/misc/index.page-vue-render.js | 2 +- book/cppToJava/misc/jar/index.html | 2 +- .../misc/jar/index.page-vue-render.js | 2 +- book/cppToJava/misc/javaFX/index.html | 2 +- .../misc/javaFX/index.page-vue-render.js | 2 +- book/cppToJava/misc/javaFX/part01/index.html | 2 +- .../javaFX/part01/index.page-vue-render.js | 2 +- book/cppToJava/misc/javaFX/part02/index.html | 2 +- .../javaFX/part02/index.page-vue-render.js | 2 +- book/cppToJava/misc/packages/index.html | 2 +- .../misc/packages/index.page-vue-render.js | 2 +- book/cppToJava/misc/streams/index.html | 2 +- .../misc/streams/index.page-vue-render.js | 2 +- book/cppToJava/misc/varargs/index.html | 2 +- .../misc/varargs/index.page-vue-render.js | 2 +- .../objects/garbageCollection/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/cppToJava/objects/index.html | 2 +- .../objects/index.page-vue-render.js | 2 +- .../objects/instanceMembers/index.html | 2 +- .../instanceMembers/index.page-vue-render.js | 2 +- .../objects/passingObjects/index.html | 2 +- .../passingObjects/index.page-vue-render.js | 2 +- .../cppToJava/objects/usingObjects/index.html | 2 +- .../usingObjects/index.page-vue-render.js | 2 +- book/cppToJava/usefulClasses/api/index.html | 2 +- .../api/index.page-vue-render.js | 2 +- .../usefulClasses/arraysClass/index.html | 2 +- .../arraysClass/index.page-vue-render.js | 2 +- book/cppToJava/usefulClasses/index.html | 2 +- .../usefulClasses/index.page-vue-render.js | 2 +- .../usefulClasses/scannerClass/index.html | 2 +- .../scannerClass/index.page-vue-render.js | 2 +- .../usefulClasses/stringClass/index.html | 2 +- .../stringClass/index.page-vue-render.js | 2 +- .../usefulClasses/wrapperClasses/index.html | 2 +- .../wrapperClasses/index.page-vue-render.js | 2 +- book/design/index.html | 2 +- book/design/index.page-vue-render.js | 2 +- book/design/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/design/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/designApproaches/agileDesign/index.html | 2 +- .../agileDesign/index.page-vue-render.js | 2 +- .../agileDesign/what/index.html | 2 +- .../agileDesign/what/index.page-vue-render.js | 2 +- book/designApproaches/index.html | 2 +- .../designApproaches/index.page-vue-render.js | 2 +- .../multilevelDesign/index.html | 2 +- .../multilevelDesign/index.page-vue-render.js | 2 +- .../multilevelDesign/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../topDownBottomUp/index.html | 2 +- .../topDownBottomUp/index.page-vue-render.js | 2 +- .../topDownBottomUp/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../designFundamentals/abstraction/index.html | 2 +- .../abstraction/index.page-vue-render.js | 2 +- .../abstraction/what/index.html | 2 +- .../abstraction/what/index.page-vue-render.js | 2 +- .../cohesion/how/index.html | 2 +- .../cohesion/how/index.page-vue-render.js | 2 +- book/designFundamentals/cohesion/index.html | 2 +- .../cohesion/index.page-vue-render.js | 2 +- .../cohesion/what/index.html | 2 +- .../cohesion/what/index.page-vue-render.js | 2 +- .../coupling/how/index.html | 2 +- .../coupling/how/index.page-vue-render.js | 2 +- book/designFundamentals/coupling/index.html | 2 +- .../coupling/index.page-vue-render.js | 2 +- .../coupling/types/index.html | 2 +- .../coupling/types/index.page-vue-render.js | 2 +- .../coupling/what/index.html | 2 +- .../coupling/what/index.page-vue-render.js | 2 +- book/designFundamentals/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../abstractionOccurrence/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../abstractionOccurrence/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/designPatterns/command/index.html | 2 +- .../command/index.page-vue-render.js | 2 +- book/designPatterns/command/what/index.html | 2 +- .../command/what/index.page-vue-render.js | 2 +- book/designPatterns/facade/index.html | 2 +- .../facade/index.page-vue-render.js | 2 +- book/designPatterns/facade/what/index.html | 2 +- .../facade/what/index.page-vue-render.js | 2 +- book/designPatterns/index.html | 2 +- book/designPatterns/index.page-vue-render.js | 2 +- .../introduction/format/index.html | 2 +- .../format/index.page-vue-render.js | 2 +- book/designPatterns/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../modelViewController/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../modelViewController/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../more/combiningDesignPatterns/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/designPatterns/more/index.html | 2 +- .../more/index.page-vue-render.js | 2 +- .../more/otherDesignPatterns/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../more/otherTypesOfPatterns/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../more/usingDesignPatterns/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../more/vsPrinciples/index.html | 2 +- .../vsPrinciples/index.page-vue-render.js | 2 +- book/designPatterns/observer/index.html | 2 +- .../observer/index.page-vue-render.js | 2 +- book/designPatterns/observer/what/index.html | 2 +- .../observer/what/index.page-vue-render.js | 2 +- .../singleton/evaluation/index.html | 2 +- .../evaluation/index.page-vue-render.js | 2 +- .../singleton/implementation/index.html | 2 +- .../implementation/index.page-vue-render.js | 2 +- book/designPatterns/singleton/index.html | 2 +- .../singleton/index.page-vue-render.js | 2 +- book/designPatterns/singleton/what/index.html | 2 +- .../singleton/what/index.page-vue-render.js | 2 +- .../aimForComprehensibility/how/index.html | 2 +- .../how/index.page-vue-render.js | 2 +- .../aimForComprehensibility/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../aimForComprehensibility/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../documentMinimally/how/index.html | 2 +- .../how/index.page-vue-render.js | 2 +- .../guidelines/documentMinimally/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../documentMinimally/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../guidelines/goTopDown/how/index.html | 2 +- .../goTopDown/how/index.page-vue-render.js | 2 +- .../guidelines/goTopDown/index.html | 2 +- .../goTopDown/index.page-vue-render.js | 2 +- .../guidelines/goTopDown/what/index.html | 2 +- .../goTopDown/what/index.page-vue-render.js | 2 +- .../guidelines/goTopDown/why/index.html | 2 +- .../goTopDown/why/index.page-vue-render.js | 2 +- book/documentation/guidelines/index.html | 2 +- .../guidelines/index.page-vue-render.js | 2 +- book/documentation/index.html | 2 +- book/documentation/index.page-vue-render.js | 2 +- book/documentation/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/documentation/tools/asciiDoc/index.html | 2 +- .../tools/asciiDoc/index.page-vue-render.js | 2 +- .../tools/asciiDoc/what/index.html | 2 +- .../asciiDoc/what/index.page-vue-render.js | 2 +- book/documentation/tools/index.html | 2 +- .../tools/index.page-vue-render.js | 2 +- .../tools/javaDoc/how/index.html | 2 +- .../javaDoc/how/index.page-vue-render.js | 2 +- book/documentation/tools/javaDoc/index.html | 2 +- .../tools/javaDoc/index.page-vue-render.js | 2 +- .../tools/javaDoc/what/index.html | 2 +- .../javaDoc/what/index.page-vue-render.js | 2 +- .../tools/markdown/how/index.html | 2 +- .../markdown/how/index.page-vue-render.js | 2 +- book/documentation/tools/markdown/index.html | 2 +- .../tools/markdown/index.page-vue-render.js | 2 +- .../tools/markdown/what/index.html | 2 +- .../markdown/what/index.page-vue-render.js | 2 +- book/errorHandling/assertions/how/index.html | 2 +- .../assertions/how/index.page-vue-render.js | 2 +- book/errorHandling/assertions/index.html | 2 +- .../assertions/index.page-vue-render.js | 2 +- book/errorHandling/assertions/what/index.html | 2 +- .../assertions/what/index.page-vue-render.js | 2 +- book/errorHandling/assertions/when/index.html | 2 +- .../assertions/when/index.page-vue-render.js | 2 +- .../1to1Associations/index.html | 2 +- .../1to1Associations/index.page-vue-render.js | 2 +- .../compulsoryAssociations/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../defensiveProgramming/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../referentialIntegrity/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../defensiveProgramming/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../defensiveProgramming/when/index.html | 2 +- .../when/index.page-vue-render.js | 2 +- .../errorHandling/designByContract/index.html | 2 +- .../designByContract/index.page-vue-render.js | 2 +- .../designByContract/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/errorHandling/exceptions/how/index.html | 2 +- .../exceptions/how/index.page-vue-render.js | 2 +- book/errorHandling/exceptions/index.html | 2 +- .../exceptions/index.page-vue-render.js | 2 +- book/errorHandling/exceptions/what/index.html | 2 +- .../exceptions/what/index.page-vue-render.js | 2 +- book/errorHandling/exceptions/when/index.html | 2 +- .../exceptions/when/index.page-vue-render.js | 2 +- book/errorHandling/index.html | 2 +- book/errorHandling/index.page-vue-render.js | 2 +- book/errorHandling/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/errorHandling/logging/how/index.html | 2 +- .../logging/how/index.page-vue-render.js | 2 +- book/errorHandling/logging/index.html | 2 +- .../logging/index.page-vue-render.js | 2 +- book/errorHandling/logging/what/index.html | 2 +- .../logging/what/index.page-vue-render.js | 2 +- .../brainstorming/index.html | 2 +- .../brainstorming/index.page-vue-render.js | 2 +- .../focusGroups/index.html | 2 +- .../focusGroups/index.page-vue-render.js | 2 +- book/gatheringRequirements/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../interviews/index.html | 2 +- .../interviews/index.page-vue-render.js | 2 +- .../observation/index.html | 2 +- .../observation/index.page-vue-render.js | 2 +- .../productSurveys/index.html | 2 +- .../productSurveys/index.page-vue-render.js | 2 +- .../prototyping/index.html | 2 +- .../prototyping/index.page-vue-render.js | 2 +- .../userSurveys/index.html | 2 +- .../userSurveys/index.page-vue-render.js | 2 +- book/gitAndGithub/branch/index.html | 2 +- .../branch/index.page-vue-render.js | 2 +- book/gitAndGithub/checkout/index.html | 2 +- .../checkout/index.page-vue-render.js | 2 +- book/gitAndGithub/clone/index.html | 2 +- .../clone/index.page-vue-render.js | 2 +- book/gitAndGithub/commit/index.html | 2 +- .../commit/index.page-vue-render.js | 2 +- book/gitAndGithub/createPRs/index.html | 2 +- .../createPRs/index.page-vue-render.js | 2 +- book/gitAndGithub/diff/index.html | 2 +- .../diff/index.page-vue-render.js | 2 +- book/gitAndGithub/fork/index.html | 2 +- .../fork/index.page-vue-render.js | 2 +- book/gitAndGithub/forkingWorkflow/index.html | 2 +- .../forkingWorkflow/index.page-vue-render.js | 2 +- book/gitAndGithub/ignore/index.html | 2 +- .../ignore/index.page-vue-render.js | 2 +- book/gitAndGithub/index.html | 2 +- book/gitAndGithub/index.page-vue-render.js | 2 +- book/gitAndGithub/init/index.html | 2 +- .../init/index.page-vue-render.js | 2 +- book/gitAndGithub/managePRs/index.html | 2 +- .../managePRs/index.page-vue-render.js | 2 +- book/gitAndGithub/mergeConflicts/index.html | 2 +- .../mergeConflicts/index.page-vue-render.js | 2 +- book/gitAndGithub/pull/index.html | 2 +- .../pull/index.page-vue-render.js | 2 +- book/gitAndGithub/push/index.html | 2 +- .../push/index.page-vue-render.js | 2 +- book/gitAndGithub/remoteBranches/index.html | 2 +- .../remoteBranches/index.page-vue-render.js | 2 +- book/gitAndGithub/reviewPRs/index.html | 2 +- .../reviewPRs/index.page-vue-render.js | 2 +- book/gitAndGithub/stash/index.html | 2 +- .../stash/index.page-vue-render.js | 2 +- book/gitAndGithub/tag/index.html | 2 +- .../gitAndGithub/tag/index.page-vue-render.js | 2 +- book/ides/debugging/index.html | 2 +- book/ides/debugging/index.page-vue-render.js | 2 +- book/ides/debugging/what/index.html | 2 +- .../debugging/what/index.page-vue-render.js | 2 +- book/ides/index.html | 2 +- book/ides/index.page-vue-render.js | 2 +- book/ides/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/ides/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/index.html | 2 +- book/index.page-vue-render.js | 2 +- .../bigBangVsIncremental/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/integration/approaches/index.html | 2 +- .../approaches/index.page-vue-render.js | 2 +- .../approaches/lateVsEarly/index.html | 2 +- .../lateVsEarly/index.page-vue-render.js | 2 +- .../approaches/topDownVsBottomUp/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../index.html | 2 +- .../index.page-vue-render.js | 2 +- book/integration/buildAutomation/index.html | 2 +- .../buildAutomation/index.page-vue-render.js | 2 +- .../buildAutomation/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/integration/index.html | 2 +- book/integration/index.page-vue-render.js | 2 +- book/integration/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/integration/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/integration/more/index.html | 2 +- .../integration/more/index.page-vue-render.js | 2 +- book/integration/more/review/index.html | 2 +- .../more/review/index.page-vue-render.js | 2 +- book/intellij/codeNavigation/index.html | 2 +- .../codeNavigation/index.page-vue-render.js | 2 +- book/intellij/debuggingBasic/index.html | 2 +- .../debuggingBasic/index.page-vue-render.js | 2 +- book/intellij/index.html | 2 +- book/intellij/index.page-vue-render.js | 2 +- .../intellij/productivityShortcuts/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/intellij/projectSetup/index.html | 2 +- .../projectSetup/index.page-vue-render.js | 2 +- book/intellij/refactoring/index.html | 2 +- .../refactoring/index.page-vue-render.js | 2 +- book/modeling/index.html | 2 +- book/modeling/index.page-vue-render.js | 2 +- book/modeling/introduction/how/index.html | 2 +- .../introduction/how/index.page-vue-render.js | 2 +- book/modeling/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/umlModels/index.html | 2 +- .../umlModels/index.page-vue-render.js | 2 +- book/modeling/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../modelingASolution/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- book/modeling/modelingASolution/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../modelingASolution/intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../modelingASolution/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../activityDiagrams/index.html | 2 +- .../activityDiagrams/index.page-vue-render.js | 2 +- .../activityDiagramsIntermediate/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../communicationDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/modeling/modelingBehaviors/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../interactionOverviewDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../sequenceDiagramsAdvanced/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../sequenceDiagramsBasic/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../sequenceDiagramsIntermediate/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../stateMachineDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../timingDiagrams/index.html | 2 +- .../timingDiagrams/index.page-vue-render.js | 2 +- .../useCaseDiagrams/index.html | 2 +- .../useCaseDiagrams/index.page-vue-render.js | 2 +- .../addingMoreInfo/index.html | 2 +- .../addingMoreInfo/index.page-vue-render.js | 2 +- .../classDiagramsAdvanced/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../classDiagramsBasic/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../classDiagramsIntermediate/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../componentDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../compositeStructureDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../deploymentDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/modeling/modelingStructures/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../objectDiagrams/index.html | 2 +- .../objectDiagrams/index.page-vue-render.js | 2 +- .../objectOrientedDomainModels/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../ooStructures/index.html | 2 +- .../ooStructures/index.page-vue-render.js | 2 +- .../packageDiagrams/index.html | 2 +- .../packageDiagrams/index.page-vue-render.js | 2 +- book/oop/associations/aggregation/index.html | 2 +- .../aggregation/index.page-vue-render.js | 2 +- .../associationClasses/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/oop/associations/composition/index.html | 2 +- .../composition/index.page-vue-render.js | 2 +- book/oop/associations/dependencies/index.html | 2 +- .../dependencies/index.page-vue-render.js | 2 +- book/oop/associations/index.html | 2 +- .../oop/associations/index.page-vue-render.js | 2 +- book/oop/associations/multiplicity/index.html | 2 +- .../multiplicity/index.page-vue-render.js | 2 +- book/oop/associations/navigability/index.html | 2 +- .../navigability/index.page-vue-render.js | 2 +- book/oop/associations/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/oop/classes/classLevelMembers/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/oop/classes/enumerations/index.html | 2 +- .../enumerations/index.page-vue-render.js | 2 +- book/oop/classes/index.html | 2 +- book/oop/classes/index.page-vue-render.js | 2 +- book/oop/classes/what/index.html | 2 +- .../oop/classes/what/index.page-vue-render.js | 2 +- book/oop/index.html | 2 +- book/oop/index.page-vue-render.js | 2 +- .../inheritance/abstractClasses/index.html | 2 +- .../abstractClasses/index.page-vue-render.js | 2 +- .../dynamicAndStaticBinding/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/oop/inheritance/index.html | 2 +- book/oop/inheritance/index.page-vue-render.js | 2 +- book/oop/inheritance/interfaces/index.html | 2 +- .../interfaces/index.page-vue-render.js | 2 +- book/oop/inheritance/overloading/index.html | 2 +- .../overloading/index.page-vue-render.js | 2 +- book/oop/inheritance/overriding/index.html | 2 +- .../overriding/index.page-vue-render.js | 2 +- .../inheritance/substitutability/index.html | 2 +- .../substitutability/index.page-vue-render.js | 2 +- book/oop/inheritance/what/index.html | 2 +- .../inheritance/what/index.page-vue-render.js | 2 +- book/oop/introduction/index.html | 2 +- .../oop/introduction/index.page-vue-render.js | 2 +- book/oop/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/oop/more/index.html | 2 +- book/oop/more/index.page-vue-render.js | 2 +- book/oop/more/miscellaneous/index.html | 2 +- .../miscellaneous/index.page-vue-render.js | 2 +- book/oop/more/review/index.html | 2 +- book/oop/more/review/index.page-vue-render.js | 2 +- book/oop/objects/abstraction/index.html | 2 +- .../abstraction/index.page-vue-render.js | 2 +- book/oop/objects/encapsulation/index.html | 2 +- .../encapsulation/index.page-vue-render.js | 2 +- book/oop/objects/index.html | 2 +- book/oop/objects/index.page-vue-render.js | 2 +- book/oop/objects/what/index.html | 2 +- .../oop/objects/what/index.page-vue-render.js | 2 +- book/oop/polymorphism/how/index.html | 2 +- .../polymorphism/how/index.page-vue-render.js | 2 +- book/oop/polymorphism/index.html | 2 +- .../oop/polymorphism/index.page-vue-render.js | 2 +- book/oop/polymorphism/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/principles/brooksLaw/index.html | 2 +- .../brooksLaw/index.page-vue-render.js | 2 +- .../dependencyInversionPrinciple/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/principles/dryPrinciple/index.html | 2 +- .../dryPrinciple/index.page-vue-render.js | 2 +- book/principles/index.html | 2 +- book/principles/index.page-vue-render.js | 2 +- .../interfaceSegregationPrinciple/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/principles/lawOfDemeter/index.html | 2 +- .../lawOfDemeter/index.page-vue-render.js | 2 +- .../liskovSubstitutionPrinciple/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../principles/openClosedPrinciple/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/principles/review/index.html | 2 +- .../review/index.page-vue-render.js | 2 +- .../separationOfConcernsPrinciple/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../singleResponsibilityPrinciple/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/principles/solidPrinciples/index.html | 2 +- .../solidPrinciples/index.page-vue-render.js | 2 +- book/principles/yagniPrinciple/index.html | 2 +- .../yagniPrinciple/index.page-vue-render.js | 2 +- .../exampleProcessModels/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../exampleProcessModels/scrum/index.html | 2 +- .../scrum/index.page-vue-render.js | 2 +- .../unifiedProcess/index.html | 2 +- .../unifiedProcess/index.page-vue-render.js | 2 +- .../exampleProcessModels/xp/index.html | 2 +- .../xp/index.page-vue-render.js | 2 +- book/processModels/index.html | 2 +- book/processModels/index.page-vue-render.js | 2 +- .../introduction/agileModels/index.html | 2 +- .../agileModels/index.page-vue-render.js | 2 +- book/processModels/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/iterativeModels/index.html | 2 +- .../iterativeModels/index.page-vue-render.js | 2 +- .../introduction/sequentialModels/index.html | 2 +- .../sequentialModels/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/processModels/more/cmmi/index.html | 2 +- .../more/cmmi/index.page-vue-render.js | 2 +- book/processModels/more/index.html | 2 +- .../more/index.page-vue-render.js | 2 +- book/processModels/summary/index.html | 2 +- .../summary/index.page-vue-render.js | 2 +- book/processModels/summary/recap/index.html | 2 +- .../summary/recap/index.page-vue-render.js | 2 +- book/projectDuke/index.html | 2 +- book/projectDuke/index.page-vue-render.js | 2 +- book/projectPlanning/buffers/index.html | 2 +- .../buffers/index.page-vue-render.js | 2 +- book/projectPlanning/ganttCharts/index.html | 2 +- .../ganttCharts/index.page-vue-render.js | 2 +- book/projectPlanning/index.html | 2 +- book/projectPlanning/index.page-vue-render.js | 2 +- book/projectPlanning/issueTrackers/index.html | 2 +- .../issueTrackers/index.page-vue-render.js | 2 +- book/projectPlanning/milestones/index.html | 2 +- .../milestones/index.page-vue-render.js | 2 +- book/projectPlanning/pertCharts/index.html | 2 +- .../pertCharts/index.page-vue-render.js | 2 +- .../workBreakdownStructure/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/qualityAssurance/codeReviews/index.html | 2 +- .../codeReviews/index.page-vue-render.js | 2 +- .../codeReviews/what/index.html | 2 +- .../codeReviews/what/index.page-vue-render.js | 2 +- .../formalVerification/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../formalVerification/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/qualityAssurance/index.html | 2 +- .../qualityAssurance/index.page-vue-render.js | 2 +- book/qualityAssurance/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../validationVsVerification/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../staticAnalysis/index.html | 2 +- .../staticAnalysis/index.page-vue-render.js | 2 +- .../staticAnalysis/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/refactoring/how/index.html | 2 +- book/refactoring/how/index.page-vue-render.js | 2 +- book/refactoring/index.html | 2 +- book/refactoring/index.page-vue-render.js | 2 +- book/refactoring/what/index.html | 2 +- .../refactoring/what/index.page-vue-render.js | 2 +- book/refactoring/when/index.html | 2 +- .../refactoring/when/index.page-vue-render.js | 2 +- book/requirements/index.html | 2 +- book/requirements/index.page-vue-render.js | 2 +- book/requirements/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../nonFunctionalRequirements/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/requirements/prioritizing/index.html | 2 +- .../prioritizing/index.page-vue-render.js | 2 +- book/requirements/quality/index.html | 2 +- .../quality/index.page-vue-render.js | 2 +- book/reuse/apis/designingAPIs/index.html | 2 +- .../designingAPIs/index.page-vue-render.js | 2 +- book/reuse/apis/index.html | 2 +- book/reuse/apis/index.page-vue-render.js | 2 +- book/reuse/apis/what/index.html | 2 +- book/reuse/apis/what/index.page-vue-render.js | 2 +- book/reuse/cloudComputing/index.html | 2 +- .../cloudComputing/index.page-vue-render.js | 2 +- book/reuse/cloudComputing/services/index.html | 2 +- .../services/index.page-vue-render.js | 2 +- book/reuse/cloudComputing/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../frameworksVsLibraries/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/reuse/frameworks/index.html | 2 +- .../reuse/frameworks/index.page-vue-render.js | 2 +- book/reuse/frameworks/what/index.html | 2 +- .../frameworks/what/index.page-vue-render.js | 2 +- book/reuse/index.html | 2 +- book/reuse/index.page-vue-render.js | 2 +- book/reuse/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/reuse/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/reuse/introduction/when/index.html | 2 +- .../when/index.page-vue-render.js | 2 +- book/reuse/libraries/how/index.html | 2 +- .../libraries/how/index.page-vue-render.js | 2 +- book/reuse/libraries/index.html | 2 +- book/reuse/libraries/index.page-vue-render.js | 2 +- book/reuse/libraries/what/index.html | 2 +- .../libraries/what/index.page-vue-render.js | 2 +- book/reuse/platforms/index.html | 2 +- book/reuse/platforms/index.page-vue-render.js | 2 +- book/reuse/platforms/what/index.html | 2 +- .../platforms/what/index.page-vue-render.js | 2 +- book/revisionControl/branching/index.html | 2 +- .../branching/index.page-vue-render.js | 2 +- .../centralizedFlow/index.html | 2 +- .../centralizedFlow/index.page-vue-render.js | 2 +- book/revisionControl/drcsVsCrcs/index.html | 2 +- .../drcsVsCrcs/index.page-vue-render.js | 2 +- .../featureBranchFlow/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../forkingWorkflow/index.html | 2 +- .../forkingWorkflow/index.page-vue-render.js | 2 +- book/revisionControl/index.html | 2 +- book/revisionControl/index.page-vue-render.js | 2 +- .../remoteRepositories/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/revisionControl/repositories/index.html | 2 +- .../repositories/index.page-vue-render.js | 2 +- book/revisionControl/savingHistory/index.html | 2 +- .../savingHistory/index.page-vue-render.js | 2 +- book/revisionControl/usingHistory/index.html | 2 +- .../usingHistory/index.page-vue-render.js | 2 +- book/revisionControl/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/softwareEngineering/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/prosAndCons/index.html | 2 +- .../prosAndCons/index.page-vue-render.js | 2 +- .../featureList/index.html | 2 +- .../featureList/index.page-vue-render.js | 2 +- .../featureList/what/index.html | 2 +- .../featureList/what/index.page-vue-render.js | 2 +- .../glossary/index.html | 2 +- .../glossary/index.page-vue-render.js | 2 +- .../glossary/what/index.html | 2 +- .../glossary/what/index.page-vue-render.js | 2 +- book/specifyingRequirements/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/specifyingRequirements/prose/index.html | 2 +- .../prose/index.page-vue-render.js | 2 +- .../prose/what/index.html | 2 +- .../prose/what/index.page-vue-render.js | 2 +- .../supplementaryRequirements/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../supplementaryRequirements/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../useCases/details/index.html | 2 +- .../useCases/details/index.page-vue-render.js | 2 +- .../useCases/identifying/index.html | 2 +- .../identifying/index.page-vue-render.js | 2 +- .../useCases/index.html | 2 +- .../useCases/index.page-vue-render.js | 2 +- .../useCases/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../useCases/usage/index.html | 2 +- .../useCases/usage/index.page-vue-render.js | 2 +- .../userStories/details/index.html | 2 +- .../details/index.page-vue-render.js | 2 +- .../userStories/index.html | 2 +- .../userStories/index.page-vue-render.js | 2 +- .../userStories/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../userStories/usage/index.html | 2 +- .../usage/index.page-vue-render.js | 2 +- book/teamwork/index.html | 2 +- book/teamwork/index.page-vue-render.js | 2 +- book/teamwork/teamStructures/index.html | 2 +- .../teamStructures/index.page-vue-render.js | 2 +- .../boundaryValueAnalysis/how/index.html | 2 +- .../how/index.page-vue-render.js | 2 +- .../boundaryValueAnalysis/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../boundaryValueAnalysis/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../combinationStrategies/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../heuristicInvalid/index.html | 2 +- .../heuristicInvalid/index.page-vue-render.js | 2 +- .../heuristicValid/index.html | 2 +- .../heuristicValid/index.page-vue-render.js | 2 +- .../combiningTestInputs/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../combiningTestInputs/mix/index.html | 2 +- .../mix/index.page-vue-render.js | 2 +- .../combiningTestInputs/why/index.html | 2 +- .../why/index.page-vue-render.js | 2 +- .../equivalencePartitions/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- .../equivalencePartitions/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../intermediate/index.html | 2 +- .../intermediate/index.page-vue-render.js | 2 +- .../equivalencePartitions/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/testCaseDesign/index.html | 2 +- book/testCaseDesign/index.page-vue-render.js | 2 +- .../introduction/blackVsGlass/index.html | 2 +- .../blackVsGlass/index.page-vue-render.js | 2 +- book/testCaseDesign/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../positiveVsNegative/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/testCaseDesign/more/index.html | 2 +- .../more/index.page-vue-render.js | 2 +- .../more/testingUseCases/index.html | 2 +- .../testingUseCases/index.page-vue-render.js | 2 +- .../summary/exercises/index.html | 2 +- .../exercises/index.page-vue-render.js | 2 +- book/testCaseDesign/summary/index.html | 2 +- .../summary/index.page-vue-render.js | 2 +- book/testCaseDesign/summary/recap/index.html | 2 +- .../summary/recap/index.page-vue-render.js | 2 +- .../dependencyInjection/how/index.html | 2 +- .../how/index.page-vue-render.js | 2 +- book/testing/dependencyInjection/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../dependencyInjection/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/testing/index.html | 2 +- book/testing/index.page-vue-render.js | 2 +- book/testing/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/testability/index.html | 2 +- .../testability/index.page-vue-render.js | 2 +- book/testing/introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/testing/tdd/how/index.html | 2 +- book/testing/tdd/how/index.page-vue-render.js | 2 +- book/testing/tdd/index.html | 2 +- book/testing/tdd/index.page-vue-render.js | 2 +- book/testing/tdd/what/index.html | 2 +- .../testing/tdd/what/index.page-vue-render.js | 2 +- book/testing/testAutomation/index.html | 2 +- .../testAutomation/index.page-vue-render.js | 2 +- .../testAutomation/testingGuis/index.html | 2 +- .../testingGuis/index.page-vue-render.js | 2 +- .../testAutomation/testingTextUis/index.html | 2 +- .../testingTextUis/index.page-vue-render.js | 2 +- book/testing/testAutomation/tools/index.html | 2 +- .../tools/index.page-vue-render.js | 2 +- .../usingTestDrivers/index.html | 2 +- .../usingTestDrivers/index.page-vue-render.js | 2 +- book/testing/testAutomation/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/testing/testCoverage/how/index.html | 2 +- .../testCoverage/how/index.page-vue-render.js | 2 +- book/testing/testCoverage/index.html | 2 +- .../testCoverage/index.page-vue-render.js | 2 +- book/testing/testCoverage/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../acceptanceVsSystemTesting/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../testingTypes/acceptanceTesting/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../acceptanceTesting/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../testingTypes/alphaBetaTesting/index.html | 2 +- .../alphaBetaTesting/index.page-vue-render.js | 2 +- .../alphaBetaTesting/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../testingTypes/developerTesting/index.html | 2 +- .../developerTesting/index.page-vue-render.js | 2 +- .../developerTesting/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../developerTesting/why/index.html | 2 +- .../why/index.page-vue-render.js | 2 +- .../testingTypes/dogfooding/index.html | 2 +- .../dogfooding/index.page-vue-render.js | 2 +- .../testingTypes/dogfooding/what/index.html | 2 +- .../dogfooding/what/index.page-vue-render.js | 2 +- .../exploratoryVsScriptedTesting/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../when/index.html | 2 +- .../when/index.page-vue-render.js | 2 +- book/testing/testingTypes/index.html | 2 +- .../testingTypes/index.page-vue-render.js | 2 +- .../integrationTesting/how/index.html | 2 +- .../how/index.page-vue-render.js | 2 +- .../integrationTesting/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../integrationTesting/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../testingTypes/regressionTesting/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../regressionTesting/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../testingTypes/systemTesting/index.html | 2 +- .../systemTesting/index.page-vue-render.js | 2 +- .../systemTesting/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../testingTypes/unitTesting/index.html | 2 +- .../unitTesting/index.page-vue-render.js | 2 +- .../testingTypes/unitTesting/stubs/index.html | 2 +- .../stubs/index.page-vue-render.js | 2 +- .../testingTypes/unitTesting/what/index.html | 2 +- .../unitTesting/what/index.page-vue-render.js | 2 +- .../basicNotations/alternatePaths/index.html | 2 +- .../alternatePaths/index.page-vue-render.js | 2 +- .../basicNotations/index.html | 2 +- .../basicNotations/index.page-vue-render.js | 2 +- .../basicNotations/linearPaths/index.html | 2 +- .../linearPaths/index.page-vue-render.js | 2 +- .../basicNotations/parallelPaths/index.html | 2 +- .../parallelPaths/index.page-vue-render.js | 2 +- .../basicNotations/rakes/index.html | 2 +- .../rakes/index.page-vue-render.js | 2 +- .../basicNotations/swimlanes/index.html | 2 +- .../swimlanes/index.page-vue-render.js | 2 +- book/uml/activityDiagrams/index.html | 2 +- .../activityDiagrams/index.page-vue-render.js | 2 +- .../activityDiagrams/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../classDiagrams/abstractClasses/index.html | 2 +- .../abstractClasses/index.page-vue-render.js | 2 +- .../abstractClasses/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/uml/classDiagrams/aggregation/index.html | 2 +- .../aggregation/index.page-vue-render.js | 2 +- .../classDiagrams/aggregation/what/index.html | 2 +- .../aggregation/what/index.page-vue-render.js | 2 +- .../associationClasses/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../associationClasses/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../uml/classDiagrams/associations/index.html | 2 +- .../associations/index.page-vue-render.js | 2 +- .../associations/labels/index.html | 2 +- .../labels/index.page-vue-render.js | 2 +- .../associations/multiplicity/index.html | 2 +- .../multiplicity/index.page-vue-render.js | 2 +- .../associations/navigability/index.html | 2 +- .../navigability/index.page-vue-render.js | 2 +- .../associations/roles/index.html | 2 +- .../roles/index.page-vue-render.js | 2 +- .../associations/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../associationsAsAttributes/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../associationsAsAttributes/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../classDiagrams/classInheritance/index.html | 2 +- .../classInheritance/index.page-vue-render.js | 2 +- .../classInheritance/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../classLevelMembers/index.html | 2 +- .../index.page-vue-render.js | 2 +- .../classLevelMembers/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/uml/classDiagrams/classes/index.html | 2 +- .../classes/index.page-vue-render.js | 2 +- .../uml/classDiagrams/classes/what/index.html | 2 +- .../classes/what/index.page-vue-render.js | 2 +- .../classDiagrams/combine/basic/index.html | 2 +- .../combine/basic/index.page-vue-render.js | 2 +- book/uml/classDiagrams/combine/index.html | 2 +- .../combine/index.page-vue-render.js | 2 +- book/uml/classDiagrams/composition/index.html | 2 +- .../composition/index.page-vue-render.js | 2 +- .../classDiagrams/composition/what/index.html | 2 +- .../composition/what/index.page-vue-render.js | 2 +- .../uml/classDiagrams/dependencies/index.html | 2 +- .../dependencies/index.page-vue-render.js | 2 +- .../dependencies/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- .../uml/classDiagrams/enumerations/index.html | 2 +- .../enumerations/index.page-vue-render.js | 2 +- .../enumerations/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/uml/classDiagrams/index.html | 2 +- .../classDiagrams/index.page-vue-render.js | 2 +- book/uml/classDiagrams/interfaces/index.html | 2 +- .../interfaces/index.page-vue-render.js | 2 +- .../classDiagrams/interfaces/what/index.html | 2 +- .../interfaces/what/index.page-vue-render.js | 2 +- .../uml/classDiagrams/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- .../introduction/what/index.html | 2 +- .../what/index.page-vue-render.js | 2 +- book/uml/index.html | 2 +- book/uml/index.page-vue-render.js | 2 +- book/uml/miscellaneous/index.html | 2 +- .../miscellaneous/index.page-vue-render.js | 2 +- .../objectVsClassDiagrams/index.html | 2 +- .../index.page-vue-render.js | 2 +- book/uml/notes/constraints/index.html | 2 +- .../constraints/index.page-vue-render.js | 2 +- book/uml/notes/index.html | 2 +- book/uml/notes/index.page-vue-render.js | 2 +- book/uml/notes/notes/index.html | 2 +- book/uml/notes/notes/index.page-vue-render.js | 2 +- .../objectDiagrams/associations/index.html | 2 +- .../associations/index.page-vue-render.js | 2 +- book/uml/objectDiagrams/index.html | 2 +- .../objectDiagrams/index.page-vue-render.js | 2 +- .../objectDiagrams/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/uml/objectDiagrams/objects/index.html | 2 +- .../objects/index.page-vue-render.js | 2 +- .../alternativePaths/index.html | 2 +- .../alternativePaths/index.page-vue-render.js | 2 +- book/uml/sequenceDiagrams/basic/index.html | 2 +- .../basic/index.page-vue-render.js | 2 +- book/uml/sequenceDiagrams/index.html | 2 +- .../sequenceDiagrams/index.page-vue-render.js | 2 +- .../sequenceDiagrams/introduction/index.html | 2 +- .../introduction/index.page-vue-render.js | 2 +- book/uml/sequenceDiagrams/loops/index.html | 2 +- .../loops/index.page-vue-render.js | 2 +- .../minimalNotation/index.html | 2 +- .../minimalNotation/index.page-vue-render.js | 2 +- .../objectCreation/index.html | 2 +- .../objectCreation/index.page-vue-render.js | 2 +- .../objectDeletion/index.html | 2 +- .../objectDeletion/index.page-vue-render.js | 2 +- .../sequenceDiagrams/optionalPaths/index.html | 2 +- .../optionalPaths/index.page-vue-render.js | 2 +- .../sequenceDiagrams/parallelPaths/index.html | 2 +- .../parallelPaths/index.page-vue-render.js | 2 +- .../referenceFrames/index.html | 2 +- .../referenceFrames/index.page-vue-render.js | 2 +- .../selfInvocation/index.html | 2 +- .../selfInvocation/index.page-vue-render.js | 2 +- .../sequenceDiagrams/staticMethods/index.html | 2 +- .../staticMethods/index.page-vue-render.js | 2 +- git-trail/index.html | 2 +- git-trail/index.page-vue-render.js | 2 +- index.html | 2 +- index.page-vue-render.js | 2 +- schedule/index.html | 2 +- schedule/index.page-vue-render.js | 2 +- schedule/timeline.html | 2 +- schedule/timeline.page-vue-render.js | 2 +- schedule/week1/admin.html | 2 +- schedule/week1/admin.page-vue-render.js | 2 +- schedule/week1/index.html | 2 +- schedule/week1/index.page-vue-render.js | 2 +- schedule/week1/project.html | 2 +- schedule/week1/project.page-vue-render.js | 2 +- schedule/week1/topics.html | 2 +- schedule/week1/topics.page-vue-render.js | 2 +- schedule/week1/tutorial.html | 2 +- schedule/week1/tutorial.page-vue-render.js | 2 +- schedule/week10/admin.html | 2 +- schedule/week10/admin.page-vue-render.js | 2 +- schedule/week10/index.html | 2 +- schedule/week10/index.page-vue-render.js | 2 +- schedule/week10/project.html | 2 +- schedule/week10/project.page-vue-render.js | 4 +- schedule/week10/topics.html | 2 +- schedule/week10/topics.page-vue-render.js | 2 +- schedule/week10/tutorial.html | 2 +- schedule/week10/tutorial.page-vue-render.js | 2 +- schedule/week11/admin.html | 2 +- schedule/week11/admin.page-vue-render.js | 2 +- schedule/week11/index.html | 2 +- schedule/week11/index.page-vue-render.js | 2 +- schedule/week11/project.html | 2 +- schedule/week11/project.page-vue-render.js | 4 +- schedule/week11/topics.html | 2 +- schedule/week11/topics.page-vue-render.js | 2 +- schedule/week11/tutorial.html | 2 +- schedule/week11/tutorial.page-vue-render.js | 2 +- schedule/week12/admin.html | 2 +- schedule/week12/admin.page-vue-render.js | 2 +- schedule/week12/index.html | 2 +- schedule/week12/index.page-vue-render.js | 2 +- schedule/week12/project.html | 2 +- schedule/week12/project.page-vue-render.js | 2 +- schedule/week12/topics.html | 2 +- schedule/week12/topics.page-vue-render.js | 2 +- schedule/week12/tutorial.html | 2 +- schedule/week12/tutorial.page-vue-render.js | 2 +- schedule/week13/admin.html | 2 +- schedule/week13/admin.page-vue-render.js | 2 +- schedule/week13/index.html | 2 +- schedule/week13/index.page-vue-render.js | 2 +- schedule/week13/project.html | 4 +- schedule/week13/project.page-vue-render.js | 4 +- schedule/week13/topics.html | 2 +- schedule/week13/topics.page-vue-render.js | 2 +- schedule/week13/tutorial.html | 2 +- schedule/week13/tutorial.page-vue-render.js | 2 +- schedule/week2/admin.html | 2 +- schedule/week2/admin.page-vue-render.js | 2 +- schedule/week2/index.html | 2 +- schedule/week2/index.page-vue-render.js | 2 +- schedule/week2/project.html | 2 +- schedule/week2/project.page-vue-render.js | 2 +- schedule/week2/topics.html | 2 +- schedule/week2/topics.page-vue-render.js | 2 +- schedule/week2/tutorial.html | 2 +- schedule/week2/tutorial.page-vue-render.js | 2 +- schedule/week3/admin.html | 2 +- schedule/week3/admin.page-vue-render.js | 2 +- schedule/week3/index.html | 2 +- schedule/week3/index.page-vue-render.js | 2 +- schedule/week3/project.html | 2 +- schedule/week3/project.page-vue-render.js | 2 +- schedule/week3/topics.html | 2 +- schedule/week3/topics.page-vue-render.js | 2 +- schedule/week3/tutorial.html | 2 +- schedule/week3/tutorial.page-vue-render.js | 2 +- schedule/week4/admin.html | 2 +- schedule/week4/admin.page-vue-render.js | 2 +- schedule/week4/index.html | 2 +- schedule/week4/index.page-vue-render.js | 2 +- schedule/week4/project.html | 2 +- schedule/week4/project.page-vue-render.js | 2 +- schedule/week4/topics.html | 2 +- schedule/week4/topics.page-vue-render.js | 2 +- schedule/week4/tutorial.html | 2 +- schedule/week4/tutorial.page-vue-render.js | 2 +- schedule/week5/admin.html | 2 +- schedule/week5/admin.page-vue-render.js | 2 +- schedule/week5/index.html | 2 +- schedule/week5/index.page-vue-render.js | 2 +- schedule/week5/project.html | 2 +- schedule/week5/project.page-vue-render.js | 2 +- schedule/week5/topics.html | 2 +- schedule/week5/topics.page-vue-render.js | 2 +- schedule/week5/tutorial.html | 2 +- schedule/week5/tutorial.page-vue-render.js | 2 +- schedule/week6/admin.html | 2 +- schedule/week6/admin.page-vue-render.js | 2 +- schedule/week6/index.html | 2 +- schedule/week6/index.page-vue-render.js | 2 +- schedule/week6/project.html | 2 +- schedule/week6/project.page-vue-render.js | 2 +- schedule/week6/topics.html | 2 +- schedule/week6/topics.page-vue-render.js | 2 +- schedule/week6/tutorial.html | 2 +- schedule/week6/tutorial.page-vue-render.js | 2 +- schedule/week7/admin.html | 2 +- schedule/week7/admin.page-vue-render.js | 2 +- schedule/week7/index.html | 2 +- schedule/week7/index.page-vue-render.js | 2 +- schedule/week7/project.html | 2 +- schedule/week7/project.page-vue-render.js | 2 +- schedule/week7/topics.html | 2 +- schedule/week7/topics.page-vue-render.js | 2 +- schedule/week7/tutorial.html | 2 +- schedule/week7/tutorial.page-vue-render.js | 2 +- schedule/week8/admin.html | 2 +- schedule/week8/admin.page-vue-render.js | 2 +- schedule/week8/index.html | 2 +- schedule/week8/index.page-vue-render.js | 2 +- schedule/week8/project.html | 2 +- schedule/week8/project.page-vue-render.js | 2 +- schedule/week8/topics.html | 2 +- schedule/week8/topics.page-vue-render.js | 2 +- schedule/week8/tutorial.html | 2 +- schedule/week8/tutorial.page-vue-render.js | 2 +- schedule/week9/admin.html | 2 +- schedule/week9/admin.page-vue-render.js | 2 +- schedule/week9/index.html | 2 +- schedule/week9/index.page-vue-render.js | 2 +- schedule/week9/project.html | 2 +- schedule/week9/project.page-vue-render.js | 2 +- schedule/week9/topics.html | 2 +- schedule/week9/topics.page-vue-render.js | 2 +- schedule/week9/tutorial.html | 2 +- schedule/week9/tutorial.page-vue-render.js | 2 +- .../architecture-printable.html | 2 +- .../architecture-printable.page-vue-render.js | 2 +- .../codeQuality-printable.html | 2 +- .../codeQuality-printable.page-vue-render.js | 2 +- .../cppToJava-printable.html | 2 +- .../cppToJava-printable.page-vue-render.js | 2 +- .../chapters-printable/design-printable.html | 2 +- .../design-printable.page-vue-render.js | 2 +- .../designApproaches-printable.html | 2 +- ...ignApproaches-printable.page-vue-render.js | 2 +- .../designFundamentals-printable.html | 2 +- ...nFundamentals-printable.page-vue-render.js | 2 +- .../designPatterns-printable.html | 2 +- ...esignPatterns-printable.page-vue-render.js | 2 +- .../documentation-printable.html | 2 +- ...documentation-printable.page-vue-render.js | 2 +- .../errorHandling-printable.html | 2 +- ...errorHandling-printable.page-vue-render.js | 2 +- .../gatheringRequirements-printable.html | 2 +- ...gRequirements-printable.page-vue-render.js | 2 +- .../gitAndGithub-printable.html | 2 +- .../gitAndGithub-printable.page-vue-render.js | 2 +- .../chapters-printable/ides-printable.html | 2 +- .../ides-printable.page-vue-render.js | 2 +- .../integration-printable.html | 2 +- .../integration-printable.page-vue-render.js | 2 +- .../intellij-printable.html | 2 +- .../intellij-printable.page-vue-render.js | 2 +- .../modeling-printable.html | 2 +- .../modeling-printable.page-vue-render.js | 2 +- .../chapters-printable/oop-printable.html | 2 +- .../oop-printable.page-vue-render.js | 2 +- .../principles-printable.html | 2 +- .../principles-printable.page-vue-render.js | 2 +- .../processModels-printable.html | 2 +- ...processModels-printable.page-vue-render.js | 2 +- .../projectPlanning-printable.html | 2 +- ...ojectPlanning-printable.page-vue-render.js | 2 +- .../qualityAssurance-printable.html | 2 +- ...lityAssurance-printable.page-vue-render.js | 2 +- .../refactoring-printable.html | 2 +- .../refactoring-printable.page-vue-render.js | 2 +- .../requirements-printable.html | 2 +- .../requirements-printable.page-vue-render.js | 2 +- .../chapters-printable/reuse-printable.html | 2 +- .../reuse-printable.page-vue-render.js | 2 +- .../revisionControl-printable.html | 2 +- ...visionControl-printable.page-vue-render.js | 2 +- .../softwareEngineering-printable.html | 2 +- ...reEngineering-printable.page-vue-render.js | 2 +- .../specifyingRequirements-printable.html | 2 +- ...gRequirements-printable.page-vue-render.js | 2 +- .../teamwork-printable.html | 2 +- .../teamwork-printable.page-vue-render.js | 2 +- .../testCaseDesign-printable.html | 2 +- ...estCaseDesign-printable.page-vue-render.js | 2 +- .../chapters-printable/testing-printable.html | 2 +- .../testing-printable.page-vue-render.js | 2 +- .../chapters-printable/uml-printable.html | 2 +- .../uml-printable.page-vue-render.js | 2 +- se-book-adapted/chapters/architecture.html | 2 +- .../chapters/architecture.page-vue-render.js | 2 +- se-book-adapted/chapters/codeQuality.html | 2 +- .../chapters/codeQuality.page-vue-render.js | 2 +- se-book-adapted/chapters/cppToJava.html | 2 +- .../chapters/cppToJava.page-vue-render.js | 2 +- se-book-adapted/chapters/design.html | 2 +- .../chapters/design.page-vue-render.js | 2 +- .../chapters/designApproaches.html | 2 +- .../designApproaches.page-vue-render.js | 2 +- .../chapters/designFundamentals.html | 2 +- .../designFundamentals.page-vue-render.js | 2 +- se-book-adapted/chapters/designPatterns.html | 2 +- .../designPatterns.page-vue-render.js | 2 +- se-book-adapted/chapters/documentation.html | 2 +- .../chapters/documentation.page-vue-render.js | 2 +- se-book-adapted/chapters/errorHandling.html | 2 +- .../chapters/errorHandling.page-vue-render.js | 2 +- .../chapters/gatheringRequirements.html | 2 +- .../gatheringRequirements.page-vue-render.js | 2 +- se-book-adapted/chapters/gitAndGithub.html | 2 +- .../chapters/gitAndGithub.page-vue-render.js | 2 +- se-book-adapted/chapters/ides.html | 2 +- .../chapters/ides.page-vue-render.js | 2 +- se-book-adapted/chapters/integration.html | 2 +- .../chapters/integration.page-vue-render.js | 2 +- se-book-adapted/chapters/intellij.html | 2 +- .../chapters/intellij.page-vue-render.js | 2 +- se-book-adapted/chapters/modeling.html | 2 +- .../chapters/modeling.page-vue-render.js | 2 +- se-book-adapted/chapters/oop.html | 2 +- .../chapters/oop.page-vue-render.js | 2 +- se-book-adapted/chapters/principles.html | 2 +- .../chapters/principles.page-vue-render.js | 2 +- se-book-adapted/chapters/processModels.html | 2 +- .../chapters/processModels.page-vue-render.js | 2 +- se-book-adapted/chapters/projectPlanning.html | 2 +- .../projectPlanning.page-vue-render.js | 2 +- .../chapters/qualityAssurance.html | 2 +- .../qualityAssurance.page-vue-render.js | 2 +- se-book-adapted/chapters/refactoring.html | 2 +- .../chapters/refactoring.page-vue-render.js | 2 +- se-book-adapted/chapters/requirements.html | 2 +- .../chapters/requirements.page-vue-render.js | 2 +- se-book-adapted/chapters/reuse.html | 2 +- .../chapters/reuse.page-vue-render.js | 2 +- se-book-adapted/chapters/revisionControl.html | 2 +- .../revisionControl.page-vue-render.js | 2 +- .../chapters/softwareEngineering.html | 2 +- .../softwareEngineering.page-vue-render.js | 2 +- .../chapters/specifyingRequirements.html | 2 +- .../specifyingRequirements.page-vue-render.js | 2 +- se-book-adapted/chapters/teamwork.html | 2 +- .../chapters/teamwork.page-vue-render.js | 2 +- se-book-adapted/chapters/test.html | 2 +- .../chapters/test.page-vue-render.js | 2 +- se-book-adapted/chapters/testCaseDesign.html | 2 +- .../testCaseDesign.page-vue-render.js | 2 +- se-book-adapted/chapters/testing.html | 2 +- .../chapters/testing.page-vue-render.js | 2 +- se-book-adapted/chapters/uml.html | 2 +- .../chapters/uml.page-vue-render.js | 2 +- se-book-adapted/common/definitions.html | 2 +- .../common/definitions.page-vue-render.js | 2 +- se-book-adapted/common/exercises.html | 2 +- .../common/exercises.page-vue-render.js | 2 +- se-book-adapted/index.html | 2 +- se-book-adapted/index.page-vue-render.js | 2 +- se-book-adapted/print.html | 2 +- se-book-adapted/print.page-vue-render.js | 2 +- se-book-adapted/projectDuke/index.html | 2 +- .../projectDuke/index.page-vue-render.js | 2 +- 1565 files changed, 1615 insertions(+), 2198 deletions(-) delete mode 100644 _markbind/logs/markbind-2024-10-28.log create mode 100644 _markbind/logs/markbind-2024-11-05.log diff --git a/_markbind/logs/markbind-2024-10-28.log b/_markbind/logs/markbind-2024-10-28.log deleted file mode 100644 index 68af761df8..0000000000 --- a/_markbind/logs/markbind-2024-10-28.log +++ /dev/null @@ -1,627 +0,0 @@ -2024-10-28T10:02:54.741Z - info: Website generation (lazy) started at 18:02:53 -2024-10-28T10:02:55.012Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' -2024-10-28T10:02:55.012Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' -2024-10-28T10:02:55.031Z - info: Building assets... -2024-10-28T10:02:56.345Z - info: Assets built -2024-10-28T10:02:56.345Z - info: Generating landing page... -2024-10-28T10:02:56.787Z - info: Landing page built, other pages will be built as you navigate to them! -2024-10-28T10:02:56.861Z - info: Site data built -2024-10-28T10:02:56.861Z - info: Website generation (lazy) complete! Total build time: 3.047s -2024-10-28T10:02:56.870Z - info: Serving "/Users/damithch/Repos/nus-cs2103/cs2103-website-base/_site" at http://127.0.0.1:8080 -2024-10-28T10:02:56.870Z - info: Press CTRL+C to stop ... -2024-10-28T10:03:38.455Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial as some of its dependencies were changed since the last visit -2024-10-28T10:03:38.603Z - info: Site data built -2024-10-28T10:03:38.604Z - info: Lazy website regeneration complete! Total build time: 0.15s -2024-10-28T10:04:48.911Z - info: [18:04:48] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:04:48.912Z - info: Synchronizing opened pages list before reload -2024-10-28T10:04:48.913Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:04:48.913Z - info: 1. schedule/week11/tutorial -2024-10-28T10:04:49.923Z - info: Rebuilding 1 pages -2024-10-28T10:04:50.024Z - info: Site data built -2024-10-28T10:04:50.024Z - info: Pages rebuilt -2024-10-28T10:04:50.024Z - info: Website regeneration complete! Total build time: 0.102s -2024-10-28T10:06:34.368Z - info: [18:06:34] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:06:34.368Z - info: Synchronizing opened pages list before reload -2024-10-28T10:06:34.368Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:06:34.369Z - info: 1. schedule/week11/tutorial -2024-10-28T10:06:35.380Z - info: Rebuilding 1 pages -2024-10-28T10:06:35.457Z - error: Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Error: cannot import 'panopto' - at Object._prettifyError (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:32:11) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:383:17 - at Template.root [as rootRenderFunc] (eval at _compile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/environment.js:527:18), :61:3) - at Template.render (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:372:8) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:54:25 - at createTemplate (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:121:7) - at handle (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:133:9) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:145:7 - at next (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:258:7) - at Object.asyncIter (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:263:3) - at Environment.getTemplate (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:127:7) - at Environment.render (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:48:8) - at VariableRenderer.renderFile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableRenderer.js:73:24) - at VariableProcessor.renderWithSiteVariables (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableProcessor.js:154:57) - at VariableProcessor.renderIncludeFile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableProcessor.js:231:38) - at processInclude (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/includePanelProcessor.js:198:68) -2024-10-28T10:06:35.482Z - info: Site data built -2024-10-28T10:06:35.482Z - info: Pages rebuilt -2024-10-28T10:06:35.482Z - info: Website regeneration complete! Total build time: 0.103s -2024-10-28T10:07:23.307Z - info: [18:07:23] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:07:23.307Z - info: Synchronizing opened pages list before reload -2024-10-28T10:07:23.307Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:07:23.307Z - info: 1. schedule/week11/tutorial -2024-10-28T10:07:24.310Z - info: Rebuilding 1 pages -2024-10-28T10:07:24.379Z - error: Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) - Error: cannot import 'panopto' - at Object._prettifyError (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:32:11) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:383:17 - at Template.root [as rootRenderFunc] (eval at _compile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/environment.js:527:18), :72:3) - at Template.render (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:372:8) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:54:25 - at createTemplate (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:121:7) - at handle (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:133:9) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:145:7 - at next (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:258:7) - at Object.asyncIter (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:263:3) - at Environment.getTemplate (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:127:7) - at Environment.render (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:48:8) - at VariableRenderer.renderFile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableRenderer.js:73:24) - at VariableProcessor.renderWithSiteVariables (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableProcessor.js:154:57) - at VariableProcessor.renderIncludeFile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableProcessor.js:231:38) - at processInclude (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/includePanelProcessor.js:198:68) -2024-10-28T10:07:24.399Z - info: Site data built -2024-10-28T10:07:24.399Z - info: Pages rebuilt -2024-10-28T10:07:24.399Z - info: Website regeneration complete! Total build time: 0.091s -2024-10-28T10:07:39.817Z - info: [18:07:39] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:07:39.817Z - info: Synchronizing opened pages list before reload -2024-10-28T10:07:39.817Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:07:39.818Z - info: 1. schedule/week11/tutorial -2024-10-28T10:07:40.836Z - info: Rebuilding 1 pages -2024-10-28T10:07:40.941Z - info: Site data built -2024-10-28T10:07:40.941Z - info: Pages rebuilt -2024-10-28T10:07:40.941Z - info: Website regeneration complete! Total build time: 0.107s -2024-10-28T10:08:22.911Z - info: [18:08:22] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:08:22.911Z - info: Synchronizing opened pages list before reload -2024-10-28T10:08:22.912Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:08:22.912Z - info: 1. schedule/week11/tutorial -2024-10-28T10:08:23.918Z - info: Rebuilding 1 pages -2024-10-28T10:08:24.032Z - info: Site data built -2024-10-28T10:08:24.032Z - info: Pages rebuilt -2024-10-28T10:08:24.032Z - info: Website regeneration complete! Total build time: 0.117s -2024-10-28T10:09:08.198Z - info: [18:09:08] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:09:08.198Z - info: Synchronizing opened pages list before reload -2024-10-28T10:09:08.198Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:09:08.199Z - info: 1. schedule/week11/tutorial -2024-10-28T10:09:09.217Z - info: Rebuilding 1 pages -2024-10-28T10:09:09.348Z - info: Site data built -2024-10-28T10:09:09.348Z - info: Pages rebuilt -2024-10-28T10:09:09.348Z - info: Website regeneration complete! Total build time: 0.133s -2024-10-28T10:17:58.179Z - info: [18:17:58] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:17:58.180Z - info: Synchronizing opened pages list before reload -2024-10-28T10:17:58.180Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:17:58.181Z - info: 1. schedule/week11/tutorial -2024-10-28T10:17:59.192Z - info: Rebuilding 1 pages -2024-10-28T10:17:59.313Z - info: Site data built -2024-10-28T10:17:59.313Z - info: Pages rebuilt -2024-10-28T10:17:59.313Z - info: Website regeneration complete! Total build time: 0.124s -2024-10-28T10:21:10.867Z - info: [18:21:10] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:21:10.868Z - info: Synchronizing opened pages list before reload -2024-10-28T10:21:10.868Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:21:10.868Z - info: 1. schedule/week11/tutorial -2024-10-28T10:21:11.878Z - info: Rebuilding 1 pages -2024-10-28T10:21:12.010Z - info: Site data built -2024-10-28T10:21:12.010Z - info: Pages rebuilt -2024-10-28T10:21:12.010Z - info: Website regeneration complete! Total build time: 0.134s -2024-10-28T10:21:26.536Z - info: [18:21:26] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:21:26.537Z - info: Synchronizing opened pages list before reload -2024-10-28T10:21:26.537Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:21:26.537Z - info: 1. schedule/week11/tutorial -2024-10-28T10:21:27.554Z - info: Rebuilding 1 pages -2024-10-28T10:21:27.662Z - info: Site data built -2024-10-28T10:21:27.663Z - info: Pages rebuilt -2024-10-28T10:21:27.663Z - info: Website regeneration complete! Total build time: 0.111s -2024-10-28T10:23:15.512Z - info: [18:23:15] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:23:15.514Z - info: Synchronizing opened pages list before reload -2024-10-28T10:23:15.514Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:23:15.514Z - info: 1. schedule/week11/tutorial -2024-10-28T10:23:16.529Z - info: Rebuilding 1 pages -2024-10-28T10:23:16.659Z - info: Site data built -2024-10-28T10:23:16.659Z - info: Pages rebuilt -2024-10-28T10:23:16.659Z - info: Website regeneration complete! Total build time: 0.131s -2024-10-28T10:24:18.807Z - info: [18:24:18] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:24:18.807Z - info: Synchronizing opened pages list before reload -2024-10-28T10:24:18.807Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:24:18.807Z - info: 1. schedule/week11/tutorial -2024-10-28T10:24:19.813Z - info: Rebuilding 1 pages -2024-10-28T10:24:19.923Z - info: Site data built -2024-10-28T10:24:19.923Z - info: Pages rebuilt -2024-10-28T10:24:19.923Z - info: Website regeneration complete! Total build time: 0.111s -2024-10-28T10:25:40.845Z - info: [18:25:40] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:25:40.846Z - info: Synchronizing opened pages list before reload -2024-10-28T10:25:40.846Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:25:40.846Z - info: 1. schedule/week11/tutorial -2024-10-28T10:25:41.848Z - info: Rebuilding 1 pages -2024-10-28T10:25:41.931Z - error: Template render error: (/Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md) [Line 8, Column 144] - expected variable end - at Object._prettifyError (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:32:11) - at Template.render (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:358:19) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:54:25 - at createTemplate (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:121:7) - at handle (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:133:9) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:145:7 - at next (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:258:7) - at Object.asyncIter (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/nunjucks/src/lib.js:263:3) - at Environment.getTemplate (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/load-event.js:127:7) - at Environment.render (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/patches/nunjucks/context-overrides-frame.js:48:8) - at VariableRenderer.renderFile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableRenderer.js:73:24) - at VariableProcessor.renderWithSiteVariables (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableProcessor.js:154:57) - at VariableProcessor.renderIncludeFile (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/variables/VariableProcessor.js:231:38) - at processInclude (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/includePanelProcessor.js:198:68) - at NodeProcessor.processNode (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:173:71) - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:342:24) -2024-10-28T10:25:41.949Z - info: Site data built -2024-10-28T10:25:41.949Z - info: Pages rebuilt -2024-10-28T10:25:41.949Z - info: Website regeneration complete! Total build time: 0.103s -2024-10-28T10:26:04.548Z - info: [18:26:04] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:26:04.548Z - info: Synchronizing opened pages list before reload -2024-10-28T10:26:04.548Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:26:04.548Z - info: 1. schedule/week11/tutorial -2024-10-28T10:26:05.551Z - info: Rebuilding 1 pages -2024-10-28T10:26:05.682Z - info: Site data built -2024-10-28T10:26:05.682Z - info: Pages rebuilt -2024-10-28T10:26:05.682Z - info: Website regeneration complete! Total build time: 0.133s -2024-10-28T10:26:48.865Z - info: [18:26:48] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:26:48.866Z - info: Synchronizing opened pages list before reload -2024-10-28T10:26:48.866Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:26:48.866Z - info: 1. schedule/week11/tutorial -2024-10-28T10:26:49.882Z - info: Rebuilding 1 pages -2024-10-28T10:26:49.991Z - info: Site data built -2024-10-28T10:26:49.991Z - info: Pages rebuilt -2024-10-28T10:26:49.991Z - info: Website regeneration complete! Total build time: 0.111s -2024-10-28T10:31:02.804Z - info: [18:31:02] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:31:02.805Z - info: Synchronizing opened pages list before reload -2024-10-28T10:31:02.805Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:31:02.805Z - info: 1. schedule/week11/tutorial -2024-10-28T10:31:03.818Z - info: Rebuilding 1 pages -2024-10-28T10:31:03.949Z - info: Site data built -2024-10-28T10:31:03.949Z - info: Pages rebuilt -2024-10-28T10:31:03.949Z - info: Website regeneration complete! Total build time: 0.133s -2024-10-28T10:31:27.519Z - info: [18:31:27] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:31:27.519Z - info: Synchronizing opened pages list before reload -2024-10-28T10:31:27.519Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:31:27.519Z - info: 1. schedule/week11/tutorial -2024-10-28T10:31:28.526Z - info: Rebuilding 1 pages -2024-10-28T10:31:28.648Z - info: Site data built -2024-10-28T10:31:28.648Z - info: Pages rebuilt -2024-10-28T10:31:28.648Z - info: Website regeneration complete! Total build time: 0.124s -2024-10-28T10:32:07.873Z - info: [18:32:07] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:32:07.873Z - info: Synchronizing opened pages list before reload -2024-10-28T10:32:07.873Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:32:07.873Z - info: 1. schedule/week11/tutorial -2024-10-28T10:32:08.881Z - info: Rebuilding 1 pages -2024-10-28T10:32:09.022Z - info: Site data built -2024-10-28T10:32:09.022Z - info: Pages rebuilt -2024-10-28T10:32:09.022Z - info: Website regeneration complete! Total build time: 0.144s -2024-10-28T10:32:15.747Z - info: [18:32:15] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:32:15.747Z - info: Synchronizing opened pages list before reload -2024-10-28T10:32:15.747Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:32:15.747Z - info: 1. schedule/week11/tutorial -2024-10-28T10:32:16.754Z - info: Rebuilding 1 pages -2024-10-28T10:32:16.863Z - info: Site data built -2024-10-28T10:32:16.863Z - info: Pages rebuilt -2024-10-28T10:32:16.863Z - info: Website regeneration complete! Total build time: 0.111s -2024-10-28T10:32:29.987Z - info: [18:32:29] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:32:29.987Z - info: Synchronizing opened pages list before reload -2024-10-28T10:32:29.987Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:32:29.987Z - info: 1. schedule/week11/tutorial -2024-10-28T10:32:30.991Z - info: Rebuilding 1 pages -2024-10-28T10:32:31.083Z - info: Site data built -2024-10-28T10:32:31.083Z - info: Pages rebuilt -2024-10-28T10:32:31.083Z - info: Website regeneration complete! Total build time: 0.094s -2024-10-28T10:32:51.467Z - info: [18:32:51] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:32:51.468Z - info: Synchronizing opened pages list before reload -2024-10-28T10:32:51.468Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:32:51.468Z - info: 1. schedule/week11/tutorial -2024-10-28T10:32:52.471Z - info: Rebuilding 1 pages -2024-10-28T10:32:52.581Z - info: Site data built -2024-10-28T10:32:52.581Z - info: Pages rebuilt -2024-10-28T10:32:52.581Z - info: Website regeneration complete! Total build time: 0.112s -2024-10-28T10:33:04.583Z - info: [18:33:04] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:33:04.585Z - info: Synchronizing opened pages list before reload -2024-10-28T10:33:04.585Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:33:04.585Z - info: 1. schedule/week11/tutorial -2024-10-28T10:33:05.600Z - info: Rebuilding 1 pages -2024-10-28T10:33:05.720Z - info: Site data built -2024-10-28T10:33:05.720Z - info: Pages rebuilt -2024-10-28T10:33:05.720Z - info: Website regeneration complete! Total build time: 0.122s -2024-10-28T10:33:41.544Z - info: [18:33:41] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:33:41.544Z - info: Synchronizing opened pages list before reload -2024-10-28T10:33:41.544Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:33:41.544Z - info: 1. schedule/week11/tutorial -2024-10-28T10:33:41.646Z - info: [18:33:41] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:33:41.646Z - info: Synchronizing opened pages list before reload -2024-10-28T10:33:41.646Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:33:41.646Z - info: 1. schedule/week11/tutorial -2024-10-28T10:33:42.551Z - info: Rebuilding 1 pages -2024-10-28T10:33:42.673Z - info: Site data built -2024-10-28T10:33:42.673Z - info: Pages rebuilt -2024-10-28T10:33:42.673Z - info: Website regeneration complete! Total build time: 0.124s -2024-10-28T10:34:33.402Z - info: [18:34:33] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:34:33.402Z - info: Synchronizing opened pages list before reload -2024-10-28T10:34:33.403Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:34:33.403Z - info: 1. schedule/week11/tutorial -2024-10-28T10:34:34.409Z - info: Rebuilding 1 pages -2024-10-28T10:34:34.525Z - info: Site data built -2024-10-28T10:34:34.526Z - info: Pages rebuilt -2024-10-28T10:34:34.526Z - info: Website regeneration complete! Total build time: 0.118s -2024-10-28T10:35:06.915Z - info: [18:35:06] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:35:06.915Z - info: Synchronizing opened pages list before reload -2024-10-28T10:35:06.915Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:35:06.915Z - info: 1. schedule/week11/tutorial -2024-10-28T10:35:07.924Z - info: Rebuilding 1 pages -2024-10-28T10:35:08.035Z - info: Site data built -2024-10-28T10:35:08.035Z - info: Pages rebuilt -2024-10-28T10:35:08.035Z - info: Website regeneration complete! Total build time: 0.112s -2024-10-28T10:35:47.181Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/index as some of its dependencies were changed since the last visit -2024-10-28T10:35:47.594Z - info: Site data built -2024-10-28T10:35:47.594Z - info: Lazy website regeneration complete! Total build time: 0.414s -2024-10-28T10:36:10.784Z - info: [18:36:10] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:36:10.785Z - info: Synchronizing opened pages list before reload -2024-10-28T10:36:10.785Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:36:10.785Z - info: 1. schedule/week11/index -2024-10-28T10:36:11.798Z - info: No pages needed to be rebuilt -2024-10-28T10:36:17.161Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial as some of its dependencies were changed since the last visit -2024-10-28T10:36:17.306Z - info: Site data built -2024-10-28T10:36:17.306Z - info: Lazy website regeneration complete! Total build time: 0.145s -2024-10-28T10:36:20.697Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/topics as some of its dependencies were changed since the last visit -2024-10-28T10:36:21.293Z - info: Site data built -2024-10-28T10:36:21.293Z - info: Lazy website regeneration complete! Total build time: 0.597s -2024-10-28T10:38:02.116Z - info: [18:38:02] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:38:02.117Z - info: Synchronizing opened pages list before reload -2024-10-28T10:38:02.117Z - info: Current opened pages, from most-to-least recent: -2024-10-28T10:38:02.117Z - info: 1. schedule/week11/tutorial -2024-10-28T10:38:03.118Z - info: Rebuilding 1 pages -2024-10-28T10:38:03.256Z - info: Site data built -2024-10-28T10:38:03.256Z - info: Pages rebuilt -2024-10-28T10:38:03.256Z - info: Website regeneration complete! Total build time: 0.139s -2024-10-28T10:38:36.541Z - info: [18:38:36] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial-cs2103-fragment.md -2024-10-28T10:38:36.541Z - info: Synchronizing opened pages list before reload -2024-10-28T10:38:36.541Z - info: No pages are currently opened -2024-10-28T10:38:37.548Z - info: No pages needed to be rebuilt -2024-10-28T10:38:50.627Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial as some of its dependencies were changed since the last visit -2024-10-28T10:38:50.762Z - info: Site data built -2024-10-28T10:38:50.762Z - info: Lazy website regeneration complete! Total build time: 0.135s -2024-10-28T10:40:14.409Z - info: Website generation started at 18:40:13 -2024-10-28T10:40:14.666Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' -2024-10-28T10:40:14.666Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' -2024-10-28T10:40:14.686Z - info: Building assets... -2024-10-28T10:40:15.982Z - info: Assets built -2024-10-28T10:40:15.983Z - info: Generating pages... -2024-10-28T10:40:21.337Z - debug: -2024-10-28T10:40:21.338Z - debug: 2024-10-28 18:40:17.712 java[60373:7524632] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 18:40:17.712 java[60373:7524632] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: -2024-10-28T10:40:21.338Z - debug: 2024-10-28 18:40:18.860 java[60406:7524934] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 18:40:18.860 java[60406:7524934] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T10:40:21.402Z - debug: -2024-10-28T10:40:21.402Z - debug: -2024-10-28T10:40:22.008Z - debug: 2024-10-28 18:40:21.635 java[60432:7525598] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 18:40:21.635 java[60432:7525598] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T10:40:29.262Z - debug: 2024-10-28 18:40:28.888 java[60451:7525882] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 18:40:28.888 java[60451:7525882] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T10:41:08.104Z - debug: 2024-10-28 18:41:06.007 java[60479:7526753] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 18:41:06.007 java[60479:7526753] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T10:41:16.973Z - debug: 2024-10-28 18:41:16.291 java[60490:7527026] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 18:41:16.291 java[60490:7527026] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T10:41:17.054Z - debug: -2024-10-28T10:41:22.645Z - info: Pages built -2024-10-28T10:41:22.710Z - info: Site data built -2024-10-28T10:41:22.710Z - info: Website generation complete! Total build time: 69.121s -2024-10-28T10:41:22.710Z - info: Build success! -2024-10-28T10:41:44.743Z - info: The website has been deployed at: https://nus-cs2103-ay2425s1.github.io/website -2024-10-28T11:27:15.475Z - info: Website generation (lazy) started at 19:27:14 -2024-10-28T11:27:15.767Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' -2024-10-28T11:27:15.767Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' -2024-10-28T11:27:15.786Z - info: Building assets... -2024-10-28T11:27:17.129Z - info: Assets built -2024-10-28T11:27:17.129Z - info: Generating landing page... -2024-10-28T11:27:17.562Z - info: Landing page built, other pages will be built as you navigate to them! -2024-10-28T11:27:17.626Z - info: Site data built -2024-10-28T11:27:17.627Z - info: Website generation (lazy) complete! Total build time: 3.084s -2024-10-28T11:27:17.636Z - info: Serving "/Users/damithch/Repos/nus-cs2103/cs2103-website-base/_site" at http://127.0.0.1:8080 -2024-10-28T11:27:17.636Z - info: Press CTRL+C to stop ... -2024-10-28T11:27:27.181Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/tutorial as some of its dependencies were changed since the last visit -2024-10-28T11:27:27.337Z - info: Site data built -2024-10-28T11:27:27.337Z - info: Lazy website regeneration complete! Total build time: 0.156s -2024-10-28T11:27:30.282Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/index as some of its dependencies were changed since the last visit -2024-10-28T11:27:30.421Z - info: Site data built -2024-10-28T11:27:30.422Z - info: Lazy website regeneration complete! Total build time: 0.141s -2024-10-28T11:27:42.389Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables as some of its dependencies were changed since the last visit -2024-10-28T11:27:42.624Z - info: Site data built -2024-10-28T11:27:42.624Z - info: Lazy website regeneration complete! Total build time: 0.235s -2024-10-28T11:29:41.345Z - info: [19:29:41] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T11:29:41.346Z - info: Synchronizing opened pages list before reload -2024-10-28T11:29:41.347Z - info: Current opened pages, from most-to-least recent: -2024-10-28T11:29:41.347Z - info: 1. admin/tp-deliverables -2024-10-28T11:29:42.358Z - info: Rebuilding 1 pages -2024-10-28T11:29:42.604Z - info: Site data built -2024-10-28T11:29:42.605Z - info: Pages rebuilt -2024-10-28T11:29:42.605Z - info: Website regeneration complete! Total build time: 0.249s -2024-10-28T11:33:05.823Z - info: [19:33:05] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T11:33:05.824Z - info: Synchronizing opened pages list before reload -2024-10-28T11:33:05.824Z - info: Current opened pages, from most-to-least recent: -2024-10-28T11:33:05.824Z - info: 1. admin/tp-deliverables -2024-10-28T11:33:06.837Z - info: Rebuilding 1 pages -2024-10-28T11:33:07.095Z - info: Site data built -2024-10-28T11:33:07.095Z - info: Pages rebuilt -2024-10-28T11:33:07.095Z - info: Website regeneration complete! Total build time: 0.26s -2024-10-28T11:33:15.360Z - info: [19:33:15] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T11:33:15.361Z - info: Synchronizing opened pages list before reload -2024-10-28T11:33:15.361Z - info: Current opened pages, from most-to-least recent: -2024-10-28T11:33:15.361Z - info: 1. admin/tp-deliverables -2024-10-28T11:33:16.365Z - info: Rebuilding 1 pages -2024-10-28T11:33:16.617Z - info: Site data built -2024-10-28T11:33:16.617Z - info: Pages rebuilt -2024-10-28T11:33:16.617Z - info: Website regeneration complete! Total build time: 0.254s -2024-10-28T11:34:08.129Z - info: [19:34:08] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T11:34:08.130Z - info: Synchronizing opened pages list before reload -2024-10-28T11:34:08.130Z - info: Current opened pages, from most-to-least recent: -2024-10-28T11:34:08.130Z - info: 1. admin/tp-deliverables -2024-10-28T11:34:09.139Z - info: Rebuilding 1 pages -2024-10-28T11:34:09.376Z - info: Site data built -2024-10-28T11:34:09.376Z - info: Pages rebuilt -2024-10-28T11:34:09.376Z - info: Website regeneration complete! Total build time: 0.24s -2024-10-28T11:34:27.122Z - info: [19:34:27] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T11:34:27.122Z - info: Synchronizing opened pages list before reload -2024-10-28T11:34:27.122Z - info: Current opened pages, from most-to-least recent: -2024-10-28T11:34:27.122Z - info: 1. admin/tp-deliverables -2024-10-28T11:34:28.135Z - info: Rebuilding 1 pages -2024-10-28T11:34:28.377Z - info: Site data built -2024-10-28T11:34:28.377Z - info: Pages rebuilt -2024-10-28T11:34:28.377Z - info: Website regeneration complete! Total build time: 0.244s -2024-10-28T11:35:00.564Z - info: [19:35:00] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T11:35:00.564Z - info: Synchronizing opened pages list before reload -2024-10-28T11:35:00.564Z - info: Current opened pages, from most-to-least recent: -2024-10-28T11:35:00.564Z - info: 1. admin/tp-deliverables -2024-10-28T11:35:01.579Z - info: Rebuilding 1 pages -2024-10-28T11:35:01.819Z - info: Site data built -2024-10-28T11:35:01.819Z - info: Pages rebuilt -2024-10-28T11:35:01.819Z - info: Website regeneration complete! Total build time: 0.241s -2024-10-28T12:10:45.646Z - info: [20:10:45] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/faq-fragment.md -2024-10-28T12:10:45.647Z - info: Synchronizing opened pages list before reload -2024-10-28T12:10:45.648Z - info: Current opened pages, from most-to-least recent: -2024-10-28T12:10:45.648Z - info: 1. admin/tp-deliverables -2024-10-28T12:10:46.667Z - info: Rebuilding 1 pages -2024-10-28T12:10:46.908Z - info: Site data built -2024-10-28T12:10:46.908Z - info: Pages rebuilt -2024-10-28T12:10:46.908Z - info: Website regeneration complete! Total build time: 0.245s -2024-10-28T12:31:34.758Z - info: [20:31:34] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T12:31:34.760Z - info: Synchronizing opened pages list before reload -2024-10-28T12:31:34.760Z - info: Current opened pages, from most-to-least recent: -2024-10-28T12:31:34.760Z - info: 1. admin/tp-deliverables -2024-10-28T12:31:35.779Z - info: Rebuilding 1 pages -2024-10-28T12:31:35.904Z - error: Error: No such segment '#faq--Q' in file: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/faq-fragment.md -Missing reference in /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md - at processInclude (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/includePanelProcessor.js:238:27) - at NodeProcessor.processNode (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:173:71) - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:342:24) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 -2024-10-28T12:31:35.910Z - error: Error: No such segment '#faq--A' in file: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/faq-fragment.md -Missing reference in /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md - at processInclude (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/includePanelProcessor.js:238:27) - at NodeProcessor.processNode (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:173:71) - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:342:24) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 - at Array.forEach () - at NodeProcessor.traverse (/opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:345:27) - at /opt/homebrew/lib/node_modules/markbind-cli/node_modules/@markbind/core/src/html/NodeProcessor.js:346:22 -2024-10-28T12:31:36.037Z - info: Site data built -2024-10-28T12:31:36.037Z - info: Pages rebuilt -2024-10-28T12:31:36.037Z - info: Website regeneration complete! Total build time: 0.261s -2024-10-28T12:31:47.416Z - info: [20:31:47] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-deliverables-dg-fragment.md -2024-10-28T12:31:47.416Z - info: Synchronizing opened pages list before reload -2024-10-28T12:31:47.416Z - info: Current opened pages, from most-to-least recent: -2024-10-28T12:31:47.416Z - info: 1. admin/tp-deliverables -2024-10-28T12:31:48.428Z - info: Rebuilding 1 pages -2024-10-28T12:31:48.642Z - info: Site data built -2024-10-28T12:31:48.642Z - info: Pages rebuilt -2024-10-28T12:31:48.642Z - info: Website regeneration complete! Total build time: 0.215s -2024-10-28T12:32:42.727Z - info: [20:32:42] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/appendixC-faq.md -2024-10-28T12:32:42.727Z - info: Synchronizing opened pages list before reload -2024-10-28T12:32:42.727Z - info: Current opened pages, from most-to-least recent: -2024-10-28T12:32:42.727Z - info: 1. admin/tp-deliverables -2024-10-28T12:32:42.728Z - info: [20:32:42] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/faq-fragment.md -2024-10-28T12:32:42.728Z - info: Synchronizing opened pages list before reload -2024-10-28T12:32:42.729Z - info: Current opened pages, from most-to-least recent: -2024-10-28T12:32:42.729Z - info: 1. admin/tp-deliverables -2024-10-28T12:32:43.747Z - info: Rebuilding 1 pages -2024-10-28T12:32:44.006Z - info: Site data built -2024-10-28T12:32:44.006Z - info: Pages rebuilt -2024-10-28T12:32:44.006Z - info: Website regeneration complete! Total build time: 0.26s -2024-10-28T12:33:24.280Z - info: Website generation started at 20:33:23 -2024-10-28T12:33:24.542Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' -2024-10-28T12:33:24.542Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' -2024-10-28T12:33:24.561Z - info: Building assets... -2024-10-28T12:33:25.861Z - info: Assets built -2024-10-28T12:33:25.861Z - info: Generating pages... -2024-10-28T12:33:32.107Z - debug: -2024-10-28T12:33:32.107Z - debug: 2024-10-28 20:33:27.906 java[62358:7632459] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 20:33:27.906 java[62358:7632459] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T12:33:32.107Z - debug: -2024-10-28T12:33:32.107Z - debug: -2024-10-28T12:33:32.107Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: 2024-10-28 20:33:29.793 java[62397:7632764] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 20:33:29.793 java[62397:7632764] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.373Z - debug: -2024-10-28T12:33:32.901Z - debug: 2024-10-28 20:33:32.438 java[62426:7633438] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 20:33:32.438 java[62426:7633438] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T12:33:40.126Z - debug: 2024-10-28 20:33:39.766 java[62441:7633694] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 20:33:39.766 java[62441:7633694] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T12:34:17.234Z - debug: 2024-10-28 20:34:16.873 java[62470:7634451] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 20:34:16.873 java[62470:7634451] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T12:34:28.167Z - debug: 2024-10-28 20:34:27.767 java[62485:7635041] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 20:34:27.767 java[62485:7635041] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T12:34:28.590Z - debug: -2024-10-28T12:34:34.136Z - info: Pages built -2024-10-28T12:34:34.204Z - info: Site data built -2024-10-28T12:34:34.204Z - info: Website generation complete! Total build time: 70.696s -2024-10-28T12:34:34.204Z - info: Build success! -2024-10-28T12:34:55.363Z - info: The website has been deployed at: https://nus-cs2103-ay2425s1.github.io/website -2024-10-28T14:54:31.668Z - info: Website generation (lazy) started at 22:54:30 -2024-10-28T14:54:32.004Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' -2024-10-28T14:54:32.005Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' -2024-10-28T14:54:32.023Z - info: Building assets... -2024-10-28T14:54:33.333Z - info: Assets built -2024-10-28T14:54:33.333Z - info: Generating landing page... -2024-10-28T14:54:33.771Z - info: Landing page built, other pages will be built as you navigate to them! -2024-10-28T14:54:33.834Z - info: Site data built -2024-10-28T14:54:33.834Z - info: Website generation (lazy) complete! Total build time: 3.097s -2024-10-28T14:54:33.844Z - info: Serving "/Users/damithch/Repos/nus-cs2103/cs2103-website-base/_site" at http://127.0.0.1:8080 -2024-10-28T14:54:33.844Z - info: Press CTRL+C to stop ... -2024-10-28T14:54:37.537Z - info: Building /Users/damithch/Repos/nus-cs2103/cs2103-website-base/schedule/week11/project as some of its dependencies were changed since the last visit -2024-10-28T14:54:38.503Z - info: Site data built -2024-10-28T14:54:38.503Z - info: Lazy website regeneration complete! Total build time: 0.967s -2024-10-28T14:57:57.163Z - info: [22:57:57] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-tasks-fragment.md -2024-10-28T14:57:57.164Z - info: Synchronizing opened pages list before reload -2024-10-28T14:57:57.164Z - info: Current opened pages, from most-to-least recent: -2024-10-28T14:57:57.164Z - info: 1. schedule/week11/project -2024-10-28T14:57:58.172Z - info: Rebuilding 1 pages -2024-10-28T14:57:59.216Z - info: Site data built -2024-10-28T14:57:59.216Z - info: Pages rebuilt -2024-10-28T14:57:59.216Z - info: Website regeneration complete! Total build time: 1.048s -2024-10-28T14:58:31.091Z - info: [22:58:31] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-tasks-fragment.md -2024-10-28T14:58:31.092Z - info: Synchronizing opened pages list before reload -2024-10-28T14:58:31.092Z - info: Current opened pages, from most-to-least recent: -2024-10-28T14:58:31.092Z - info: 1. schedule/week11/project -2024-10-28T14:58:32.096Z - info: Rebuilding 1 pages -2024-10-28T14:58:33.145Z - info: Site data built -2024-10-28T14:58:33.145Z - info: Pages rebuilt -2024-10-28T14:58:33.145Z - info: Website regeneration complete! Total build time: 1.051s -2024-10-28T15:03:41.958Z - info: [23:03:41] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-tasks-fragment.md -2024-10-28T15:03:41.958Z - info: Synchronizing opened pages list before reload -2024-10-28T15:03:41.959Z - info: Current opened pages, from most-to-least recent: -2024-10-28T15:03:41.959Z - info: 1. schedule/week11/project -2024-10-28T15:03:42.976Z - info: Rebuilding 1 pages -2024-10-28T15:03:44.000Z - info: Site data built -2024-10-28T15:03:44.000Z - info: Pages rebuilt -2024-10-28T15:03:44.000Z - info: Website regeneration complete! Total build time: 1.026s -2024-10-28T15:04:05.885Z - info: [23:04:05] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-tasks-fragment.md -2024-10-28T15:04:05.885Z - info: Synchronizing opened pages list before reload -2024-10-28T15:04:05.886Z - info: Current opened pages, from most-to-least recent: -2024-10-28T15:04:05.886Z - info: 1. schedule/week11/project -2024-10-28T15:04:06.901Z - info: Rebuilding 1 pages -2024-10-28T15:04:07.914Z - info: Site data built -2024-10-28T15:04:07.915Z - info: Pages rebuilt -2024-10-28T15:04:07.915Z - info: Website regeneration complete! Total build time: 1.016s -2024-10-28T15:05:13.904Z - info: [23:05:13] Reload for file change: /Users/damithch/Repos/nus-cs2103/cs2103-website-base/admin/tp-tasks-fragment.md -2024-10-28T15:05:13.904Z - info: Synchronizing opened pages list before reload -2024-10-28T15:05:13.905Z - info: Current opened pages, from most-to-least recent: -2024-10-28T15:05:13.905Z - info: 1. schedule/week11/project -2024-10-28T15:05:14.922Z - info: Rebuilding 1 pages -2024-10-28T15:05:15.925Z - info: Site data built -2024-10-28T15:05:15.925Z - info: Pages rebuilt -2024-10-28T15:05:15.926Z - info: Website regeneration complete! Total build time: 1.006s -2024-10-28T15:05:52.535Z - info: Website generation started at 23:05:51 -2024-10-28T15:05:52.730Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' -2024-10-28T15:05:52.730Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' -2024-10-28T15:05:52.749Z - info: Building assets... -2024-10-28T15:05:54.044Z - info: Assets built -2024-10-28T15:05:54.045Z - info: Generating pages... -2024-10-28T15:05:59.703Z - debug: -2024-10-28T15:05:59.703Z - debug: 2024-10-28 23:05:55.746 java[70049:7773303] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 23:05:55.746 java[70049:7773303] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: -2024-10-28T15:05:59.704Z - debug: 2024-10-28 23:05:56.640 java[70088:7773618] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 23:05:56.640 java[70088:7773618] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T15:06:01.067Z - debug: 2024-10-28 23:06:00.356 java[70113:7774330] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 23:06:00.356 java[70113:7774330] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T15:06:08.261Z - debug: 2024-10-28 23:06:07.899 java[70127:7774546] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 23:06:07.899 java[70127:7774546] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T15:06:46.845Z - debug: 2024-10-28 23:06:44.676 java[70149:7775063] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 23:06:44.676 java[70149:7775063] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T15:06:55.358Z - debug: 2024-10-28 23:06:54.990 java[70157:7775275] +[IMKClient subclass]: chose IMKClient_Legacy -2024-10-28 23:06:54.990 java[70157:7775275] +[IMKInputSession subclass]: chose IMKInputSession_Legacy - -2024-10-28T15:06:55.781Z - debug: -2024-10-28T15:07:01.359Z - info: Pages built -2024-10-28T15:07:01.427Z - info: Site data built -2024-10-28T15:07:01.427Z - info: Website generation complete! Total build time: 69.541s -2024-10-28T15:07:01.427Z - info: Build success! -2024-10-28T15:07:23.897Z - info: The website has been deployed at: https://nus-cs2103-ay2425s1.github.io/website diff --git a/_markbind/logs/markbind-2024-11-04.log b/_markbind/logs/markbind-2024-11-04.log index 2f881087c2..0ca19d8746 100644 --- a/_markbind/logs/markbind-2024-11-04.log +++ b/_markbind/logs/markbind-2024-11-04.log @@ -2,3 +2,43 @@ 2024-11-04T15:57:25.612Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' 2024-11-04T15:57:25.613Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' 2024-11-04T15:57:25.631Z - info: Building assets... +2024-11-04T15:57:27.215Z - info: Assets built +2024-11-04T15:57:27.215Z - info: Generating pages... +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: 2024-11-04 23:57:29.058 java[9004:2936833] +[IMKClient subclass]: chose IMKClient_Modern +2024-11-04 23:57:29.058 java[9004:2936833] +[IMKInputSession subclass]: chose IMKInputSession_Modern + +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.312Z - debug: 2024-11-04 23:57:30.054 java[9026:2937056] +[IMKClient subclass]: chose IMKClient_Modern +2024-11-04 23:57:30.054 java[9026:2937056] +[IMKInputSession subclass]: chose IMKInputSession_Modern + +2024-11-04T15:57:32.312Z - debug: +2024-11-04T15:57:32.313Z - debug: +2024-11-04T15:57:32.313Z - debug: +2024-11-04T15:57:32.313Z - debug: +2024-11-04T15:57:32.830Z - debug: +2024-11-04T15:57:32.830Z - debug: +2024-11-04T15:57:33.003Z - debug: 2024-11-04 23:57:32.631 java[9080:2937875] +[IMKClient subclass]: chose IMKClient_Modern +2024-11-04 23:57:32.631 java[9080:2937875] +[IMKInputSession subclass]: chose IMKInputSession_Modern + +2024-11-04T15:57:40.621Z - debug: 2024-11-04 23:57:40.246 java[9093:2938067] +[IMKClient subclass]: chose IMKClient_Modern +2024-11-04 23:57:40.246 java[9093:2938067] +[IMKInputSession subclass]: chose IMKInputSession_Modern + +2024-11-04T15:58:20.124Z - debug: 2024-11-04 23:58:17.864 java[9125:2938663] +[IMKClient subclass]: chose IMKClient_Modern +2024-11-04 23:58:17.864 java[9125:2938663] +[IMKInputSession subclass]: chose IMKInputSession_Modern + +2024-11-04T15:58:29.115Z - debug: 2024-11-04 23:58:28.662 java[9158:2939150] +[IMKClient subclass]: chose IMKClient_Modern +2024-11-04 23:58:28.662 java[9158:2939150] +[IMKInputSession subclass]: chose IMKInputSession_Modern + +2024-11-04T15:58:29.457Z - debug: +2024-11-04T15:58:35.130Z - info: Pages built +2024-11-04T15:58:35.204Z - info: Site data built +2024-11-04T15:58:35.204Z - info: Website generation complete! Total build time: 70.804s +2024-11-04T15:58:35.204Z - info: Build success! +2024-11-04T15:58:56.258Z - info: The website has been deployed at: https://nus-cs2103-ay2425s1.github.io/website diff --git a/_markbind/logs/markbind-2024-11-05.log b/_markbind/logs/markbind-2024-11-05.log new file mode 100644 index 0000000000..d218e8524b --- /dev/null +++ b/_markbind/logs/markbind-2024-11-05.log @@ -0,0 +1,4 @@ +2024-11-05T07:21:42.056Z - info: Website generation started at 15:21:41 +2024-11-05T07:21:42.388Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/book/_markbind/variables.md' +2024-11-05T07:21:42.389Z - warn: ENOENT: no such file or directory, open '/Users/damithch/Repos/nus-cs2103/cs2103-website-base/node_modules/.cache/gh-pages/https!github.com!nus-cs2103-AY2425S1!website.git/_markbind/variables.md' +2024-11-05T07:21:42.408Z - info: Building assets... diff --git a/admin/appendixA-principles.html b/admin/appendixA-principles.html index b6d463c7e0..502d29e57a 100644 --- a/admin/appendixA-principles.html +++ b/admin/appendixA-principles.html @@ -23,7 +23,7 @@

Grade BreakdownApdx B: Course Policies


Apdx A: Course Principles : OPTIONAL

These are some of the main principles underlying the course structure.

The product is you, NOT what you build. -

The software product you build is a side effect only. You are the product of this course. This means,

  • We may not take the most efficient route to building the software product. We take the route that allows you to learn the most.
  • Building a software product that is unique, creative, and shiny is not our priority (although we try to do a bit of that too). Learning to take pride in, and discovering the joy of, high quality software engineering work is our priority.

Following from that, we evaluate you on not just how much you've done, but also, how well you've done those things. Here are some of the aspects in which we focus on:

We appreciate ...

But we value more ...

Ability to deal with low-level details

Ability to abstract over details, generalize, see the big picture

A drive to learn latest and greatest technologies

Ability to make the best of given tools

Ability to find problems that interest you and solve them

Ability to solve the given problem to the best of your ability

Ability to burn the midnight oil to meet a deadline

Ability to schedule work so that the need for 'last minute heroics' is minimal

Preference to do things you like or things you are good at

Ability to buckle down and deliver on important things that you don't necessarily like or are good at

Ability to deliver desired end results

Ability to deliver in a way that shows how well you delivered (i.e. visibility of your work)

We learn together, NOT compete against each other.

You are not in a competition. Our grading is not forced on a bell curve.

Learn from each other. That is why we open-source your submissions.

Teach each other, even those in other teams. Those who do it well can become tutors next time.

Continuously engage, NOT last minute heroics.

We want to train you to do software engineering in a steady and repeatable manner that does not require 'last minute heroics'.

In this course, last minute heroics will not earn you a good project grade, and last minute mugging will not earn you a good exam grade.

Where you reach at the end matters, NOT what you knew at the beginning.

When you start the course, some others in the class may appear to know a lot more than you. Don't let that worry you. The final grade depends on what you know at the end, not what you knew to begin with. All marks allocated to intermediate deliverables are within the reach of everyone in the class irrespective of their prior knowledge.


Grade BreakdownApdx B: Course Policies

[Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
+

The software product you build is a side effect only. You are the product of this course. This means,

  • We may not take the most efficient route to building the software product. We take the route that allows you to learn the most.
  • Building a software product that is unique, creative, and shiny is not our priority (although we try to do a bit of that too). Learning to take pride in, and discovering the joy of, high quality software engineering work is our priority.

Following from that, we evaluate you on not just how much you've done, but also, how well you've done those things. Here are some of the aspects in which we focus on:

We appreciate ...

But we value more ...

Ability to deal with low-level details

Ability to abstract over details, generalize, see the big picture

A drive to learn latest and greatest technologies

Ability to make the best of given tools

Ability to find problems that interest you and solve them

Ability to solve the given problem to the best of your ability

Ability to burn the midnight oil to meet a deadline

Ability to schedule work so that the need for 'last minute heroics' is minimal

Preference to do things you like or things you are good at

Ability to buckle down and deliver on important things that you don't necessarily like or are good at

Ability to deliver desired end results

Ability to deliver in a way that shows how well you delivered (i.e. visibility of your work)

We learn together, NOT compete against each other.

You are not in a competition. Our grading is not forced on a bell curve.

Learn from each other. That is why we open-source your submissions.

Teach each other, even those in other teams. Those who do it well can become tutors next time.

Continuously engage, NOT last minute heroics.

We want to train you to do software engineering in a steady and repeatable manner that does not require 'last minute heroics'.

In this course, last minute heroics will not earn you a good project grade, and last minute mugging will not earn you a good exam grade.

Where you reach at the end matters, NOT what you knew at the beginning.

When you start the course, some others in the class may appear to know a lot more than you. Don't let that worry you. The final grade depends on what you know at the end, not what you knew to begin with. All marks allocated to intermediate deliverables are within the reach of everyone in the class irrespective of their prior knowledge.


Grade BreakdownApdx B: Course Policies

[Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
diff --git a/admin/appendixA-principles.page-vue-render.js b/admin/appendixA-principles.page-vue-render.js index 06aa34ca14..eacafc68cb 100644 --- a/admin/appendixA-principles.page-vue-render.js +++ b/admin/appendixA-principles.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Where you reach at the end matters, N with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Grade Breakdown")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('span',[_v("Apdx B: Course Policies "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/appendixB-policies.html b/admin/appendixB-policies.html index c205f3becf..19cc0a44d9 100644 --- a/admin/appendixB-policies.html +++ b/admin/appendixB-policies.html @@ -191,7 +191,7 @@

Giving credit for reused images (and other media assets): Ideally, the source should be credited where the asset appears. For example, if you reused an image in your GUI, you can credit the source where a screenshot of the GUI showing that image appears first in your user guide. In addition, you can also acknowledge the sources in your GitHub project's landing page (e.g., README.md)

Giving credit to AB3 code: If your team project code follows a design similar to AB3, that doesn't mean you need to credit AB3 -- this is because a brownfield project is expected to follow existing code/design where possible, in the interest of consistency. This type of reuse need not be acknowledged/credited specifically.

Giving credit to AB4 code: If you reused any code from AB4, cite it as you would cite reuse from any other external source.

Giving credit for reusing from course materials (e.g., course textbook, tutorials, instructional resources from se-education.org) is not required, although you are welcome to do so. Reason: Those materials were created by the teaching team for you to use/reuse.

Reuse within the team (e.g., reusing code written by a team member) need not be mentioned explicitly. However, you should factor in such reuse when you estimate effort contributed by each team member.

Reuse of documentation (e.g., reusing a UG/DG section) is no different from code reuse. Such reuse should be credited as well.

Citing the use of AI-generated/assisted work (e.g., using GitHub Copilot for project work):

  • If the use of the tool was localized into a few places (e.g., used it to write a few methods/classes only), cite its use in comments near where you used it.
  • If the use was more widespread (e.g., used it as an auto-complete tool during most of your coding), cite the usage (i.e., which tool, who used it, the extent of use) in the following location instead (i.e., no need to cite in code comments): -
    • iP: in the README file
    • tP: in the DG, under the Acknowledgements section

Policy on feedback for project work

The teaching team will not give ad-hoc feedback on project work connected to a component yet to be graded. For example, if you were to ask your tutor for feedback on your individual or team project feature design, the tutor is not allowed to give feedback. Similarly, if you are faced with a design decision in your project, a tutor will not make that decision for you.

Reasons:

  • to ensure the work you submit for grading is entirely your own
  • to ensure fairness across teams

You can still use the course forum to seek feedback on a specific aspect of your project where a professor can answer the question in a general way that's not unfair to other teams (and other teams can benefit from the answer as well).
Alternatively, you can send your question to cs2103@comp.nus.edu.sg.

Policy on help from outsiders

In general, you are not allowed to involve outsiders in your project except your team members and the teaching team. However, It is OK to give your product to others for the purpose of getting voluntary user feedback. It is also OK to learn from others as long as they don't do your project work themselves.

Policy on deadline extensions : OPTIONAL

The ability to meet deadlines is a learning outcome of this course. Therefore, we do not normally extend course deadlines to accommodate those who missed the deadline, unless there are some extraordinary circumstances.

However, weekly project deliverables without specific deadlines are flexible. You will not be penalized for missing them if you catch up within a few days.


Apdx A: Course PrinciplesApdx C: FAQ

[Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
+
  • iP: in the README file
  • tP: in the DG, under the Acknowledgements section

Policy on feedback for project work

The teaching team will not give ad-hoc feedback on project work connected to a component yet to be graded. For example, if you were to ask your tutor for feedback on your individual or team project feature design, the tutor is not allowed to give feedback. Similarly, if you are faced with a design decision in your project, a tutor will not make that decision for you.

Reasons:

  • to ensure the work you submit for grading is entirely your own
  • to ensure fairness across teams

You can still use the course forum to seek feedback on a specific aspect of your project where a professor can answer the question in a general way that's not unfair to other teams (and other teams can benefit from the answer as well).
Alternatively, you can send your question to cs2103@comp.nus.edu.sg.

Policy on help from outsiders

In general, you are not allowed to involve outsiders in your project except your team members and the teaching team. However, It is OK to give your product to others for the purpose of getting voluntary user feedback. It is also OK to learn from others as long as they don't do your project work themselves.

Policy on deadline extensions : OPTIONAL

The ability to meet deadlines is a learning outcome of this course. Therefore, we do not normally extend course deadlines to accommodate those who missed the deadline, unless there are some extraordinary circumstances.

However, weekly project deliverables without specific deadlines are flexible. You will not be penalized for missing them if you catch up within a few days.


Apdx A: Course PrinciplesApdx C: FAQ

[Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
diff --git a/admin/appendixB-policies.page-vue-render.js b/admin/appendixB-policies.page-vue-render.js index e35a37a3a1..a8535ee4df 100644 --- a/admin/appendixB-policies.page-vue-render.js +++ b/admin/appendixB-policies.page-vue-render.js @@ -80,6 +80,6 @@ with(this){return _c('div',{attrs:{"id":"policy-deadlineExtensions"}},[_c('h3',{ with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Apdx A: Course Principles")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('span',[_v("Apdx C: FAQ "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/appendixC-faq.html b/admin/appendixC-faq.html index f32a073d01..5d65363200 100644 --- a/admin/appendixC-faq.html +++ b/admin/appendixC-faq.html @@ -35,7 +35,7 @@ But you should still allocate different members to be 'in charge of' different components.


FAQ Will I lose marks if I couldn't merge any PRs in an iteration?

As it is the case with other similar tP requirements, there is no penalty for missing this expectation occasionally. But try not to miss it too often.


FAQ Do we have to update tests when we update functional code?

In very early iterations, try to keep the existing tests (and CI) working. It is OK not to add new tests.

In general, there are several options you can choose from:

  1. Update/add tests every time you change functional code. This is what normally happens in stable production systems. For example, most OSS projects will not accept a PR that has failing tests or not enough new tests to cover the new functional code.
  2. Disable failing tests temporarily until the code is stable. This is suitable when the functional code is in a highly volatile state (e.g., you are still experimenting with the implementation). The benefit is that you avoid the cost of writing tests for functional code that might change again soon after. Some costs: (a) harder to detect regressions during the period tests are disabled (b) testing debt piles up which could distort your estimate of real progress (c) forgetting to enable the tests in time.
    This is still a viable option during some stages of a tP e.g., during the early part of an iteration, or while a PR is still in 'draft' state (i.e., for getting early feedback from the team).
  3. Decide certain tests are not worth the effort to maintain, and delete them permanently. Result: Less test code to maintain but higher risk of undetected regressions.

FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?

In some cases the code edited by the PR is not covered by existing tests, which means Codecov will report it as not adhering to the current coverage targets.

First, find out which area of the code is causing the coverage drop. You can use Codecov or code coverage features of the IDE to do so.

Then you can do the following:

  • Ignore those warnings, and merge the PR (a member with admin permissions can merge a CI-failing PR). Suitable for cases such as,
    • the coverage drop is in code that is not normally covered by automated tests and/or 'not worth the effort to' test automatically (e.g., GUI).
    • you deem that automated testing of that part of the code can be done at a later time (i.e., not a priority at the current time).
  • Alternatively, update tests until the coverage is raised back to sufficient level.

Note that Codecov is there to help you manage code coverage -- it is not graded. You may lower the test coverage targets set for Codecov as well.

For reference,


FAQ Do we need to update user/developer guides to match code changes?

In general, it is better for a PR to update code, tests, and documentation together.

In early iterations, it is fine not to update documentation, to keep things simple. We can start updating docs in a later iteration, when the code is more stable.


FAQ Must we fix all bugs reported and all enhancements suggested by testers?

Not necessarily. Choose based on importance.

In any project, there are always things that can be done 'if there was more time'. If fixing a certain bug has low impact on users, and fixing it is not as important as the work done (or intend to do in the current iteration), you can justify not fixing it with the reason 'not in scope' of the current iteration.

Similarly, a missing feature enhancement can be justified as 'not in scope' if implementing that could have taken resources away from other important project tasks.

Bugs and possible enhancements 'not in scope' will not be penalized.


FAQ Should we try to automate GUI testing as well?

Automated GUI testing is hard, especially in Desktop apps, especially in CI (because the environment that CI runs doesn't have a display device to show the GUI).

A few years ago, we used AB4 as the starting point of the tP.

  • The main difference between AB4 and AB3? AB4 has automated GUI testing. It used the TestFX tool to do so, and ran the test in 'headless' mode in CI (i.e., simulate a display device without an actual display device).
  • The main reason we changed tP to start with AB3 code was that some students found it too hard to maintain those GUI tests.

While we don't require you to automate GUI testing in your tP (i.e., it is fine to do only manual GUI testing), you are welcome to give it a try too, especially if you like a technical challenge.

  • Even if you get it working in only some OS'es only, and only in local environment, it is still a useful way to test the GUI quickly.
  • It is possible to run tests selectively, which means you can still run them in environments they work and skip them in other environments.

Feel free to reuse/refer AB4 code too. If you manage to make some headway in this direction, you are encouraged to share it with others via the forum.


FAQ Why not wait till the end to add/update the DG diagrams?

Here are some reasons:

  • We want you to take at least two passes at documenting the project so that you can learn how to evolve the documentation along with the code (which requires additional considerations, when compared to documenting the project only once).
  • It is better to get used to the documentation tool chain early, to avoid unexpected problems near the final submission deadline.
  • It allows receiving early self/peer/instructor feedback.

FAQ What if someone took over a feature from another team member?

In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature.
-For code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can override that behavior using @@author tags.


FAQs on: tP Troubleshooting

FAQ PR passed CI before merging, but fails CI after merging. How come?

It is possible that the master branch has received new commits after your PR passed CI the last time. So, if GitHub indicates that your PR is not up-to-date with the latest master branch, synchronize your PR branch with the master branch (which will run the CI again) before merging it.


FAQ All tests pass locally, but the same code fails CI in the PR. How come?

First, check which OS it is failing in. Some behaviors can be OS-dependent. For example, file paths are case-insensitive in Windows but not in Unix/Mac.

Second, note that PR CI does a temporary merge of master branch to the PR branch before running tests, to verify if the checks will pass after you merge this PR. So, if the master branch has progressed after you started your PR branch, those new commits can affect the CI result. The remedy is to pull the master branch to your repo, merge it to your PR branch, and run tests again (which should fail as well, but you can now find the reason for the failure and fix it).



Apdx B: Course PoliciesApdx D: Getting Help

[Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
+For code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can override that behavior using @@author tags.


FAQs on: tP Troubleshooting

FAQ PR passed CI before merging, but fails CI after merging. How come?

It is possible that the master branch has received new commits after your PR passed CI the last time. So, if GitHub indicates that your PR is not up-to-date with the latest master branch, synchronize your PR branch with the master branch (which will run the CI again) before merging it.


FAQ All tests pass locally, but the same code fails CI in the PR. How come?

First, check which OS it is failing in. Some behaviors can be OS-dependent. For example, file paths are case-insensitive in Windows but not in Unix/Mac.

Second, note that PR CI does a temporary merge of master branch to the PR branch before running tests, to verify if the checks will pass after you merge this PR. So, if the master branch has progressed after you started your PR branch, those new commits can affect the CI result. The remedy is to pull the master branch to your repo, merge it to your PR branch, and run tests again (which should fail as well, but you can now find the reason for the failure and fix it).



Apdx B: Course PoliciesApdx D: Getting Help

[Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
diff --git a/admin/appendixC-faq.page-vue-render.js b/admin/appendixC-faq.page-vue-render.js index 1123fde6b3..a02ded3317 100644 --- a/admin/appendixC-faq.page-vue-render.js +++ b/admin/appendixC-faq.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('h3',{attrs:{"id":"faqs-on-tp-troubleshooting"}},[_v("FAQs with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Apdx B: Course Policies")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('span',[_v("Apdx D: Getting Help "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/appendixD-help.html b/admin/appendixD-help.html index a6afc05954..a101e81248 100644 --- a/admin/appendixD-help.html +++ b/admin/appendixD-help.html @@ -106,7 +106,7 @@
  • Avoid directing the question to one person (e.g., the prof), unless really necessary. Doing so will discourage others from answering that question.

  • Isolate the problem. "My code doesn't work" isn't going to help even if you post the whole code. Others don't have time to go through all of your code. Isolate the part that doesn't work and strip it down to the bare minimum that is enough to reproduce the error. Sometimes, this process actually helps you to figure out the problem yourself (have you heard about Rubber Duck Debugging?).

    How to isolate problematic code? Delete code (one bit at a time) that is confirmed as not related to the problem. Do that until you can still reproduce the problem with the least amount of code remaining.

  • Generalize the problem. "How to write tasks to a text file using Java" is too specific to what you are working on. You are more likely to find help if you post a thread called (or search for) "How to write to a file using Java".

  • Remember to thank those who try to help, and close the issue after the issue has been resolved.

  • Share the solution. If you eventually managed to solve the problem on your own, share the solution in the thread for the benefit of others, and give closure to those who tried to help you. Don't leave the thread hanging or close it with something like Never mind. I figured it out.

  • Don't hijack other threads: It is OK to chime in if you have the same problem as the but don't ask a different (even if somewhat related) question in someone else's thread. That prevents the OP from closing the thread after the original question has been resolved. Instead, post your question as a separate thread.

    • Ask the world using programming forums such as stackoverflow. -
      • PLEASE search for existing answers before you post your question in those public forums; You don't want to appear as a 'clueless' or 'too lazy to do your research' person in a public forum.

        Know what these stand for: RTFM, STFW, GIYF, LMGTFY

    • Raise your question during a tutorial. Some questions can be discussed with the tutor and tutorial-mates.

    FAQ What kind of questions can I ask the tutor?

    TLDR: In this course, tutor's main job is to deliver tutorials. Hence, tutors can answer questions related to (and arising from) the tutorial delivery. But they are not allowed to answer admin questions. They are not allowed to help with technical issues.

    • Good I did not understand your explanation of that question. Why did you say "a b c"?
      Reason: This question is a follow-up from a tutorial discussion.
    • Good This is how I understood coupling. Is that correct?
      Reason: This question shows you have put in some effort to learn the topic and seeking further clarification from the tutor.
    • Bad What is coupling? | What is SLAP?
      Reason: These are concept covered in the textbook and other resources provided.
    • Bad How will this be graded? | What happens if this submission is late?
      Reason: Tutors are not allowed to answer admin questions.
    • Bad My program crashes with this error; what to do?
      Reason: Tutors are not allowed to help with technical issues (post your issue in the forum instead).

    • Ask the lecturer: You can talk to the lecturer before/after the weekly briefing, or email the lecturer.

    Some technical problems can take a long time to resolve. Therefore, plan ahead and schedule your work much earlier than the deadline.

    Some problems might not get resolved at all; while waiting for a solution, explore alternatives and workarounds.

    If your problem remains unsolved 24 hours after posting in the forum, please alert cs2103@comp.nus.edu.sg so that the teaching team can look into it.

    Resources


    Apdx C: FAQApdx E: Using GitHub

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • PLEASE search for existing answers before you post your question in those public forums; You don't want to appear as a 'clueless' or 'too lazy to do your research' person in a public forum.

      Know what these stand for: RTFM, STFW, GIYF, LMGTFY

    • Raise your question during a tutorial. Some questions can be discussed with the tutor and tutorial-mates.

    FAQ What kind of questions can I ask the tutor?

    TLDR: In this course, tutor's main job is to deliver tutorials. Hence, tutors can answer questions related to (and arising from) the tutorial delivery. But they are not allowed to answer admin questions. They are not allowed to help with technical issues.

    • Good I did not understand your explanation of that question. Why did you say "a b c"?
      Reason: This question is a follow-up from a tutorial discussion.
    • Good This is how I understood coupling. Is that correct?
      Reason: This question shows you have put in some effort to learn the topic and seeking further clarification from the tutor.
    • Bad What is coupling? | What is SLAP?
      Reason: These are concept covered in the textbook and other resources provided.
    • Bad How will this be graded? | What happens if this submission is late?
      Reason: Tutors are not allowed to answer admin questions.
    • Bad My program crashes with this error; what to do?
      Reason: Tutors are not allowed to help with technical issues (post your issue in the forum instead).

    • Ask the lecturer: You can talk to the lecturer before/after the weekly briefing, or email the lecturer.

    Some technical problems can take a long time to resolve. Therefore, plan ahead and schedule your work much earlier than the deadline.

    Some problems might not get resolved at all; while waiting for a solution, explore alternatives and workarounds.

    If your problem remains unsolved 24 hours after posting in the forum, please alert cs2103@comp.nus.edu.sg so that the teaching team can look into it.

    Resources


    Apdx C: FAQApdx E: Using GitHub

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/appendixD-help.page-vue-render.js b/admin/appendixD-help.page-vue-render.js index 12b30f64b8..e4f69438a6 100644 --- a/admin/appendixD-help.page-vue-render.js +++ b/admin/appendixD-help.page-vue-render.js @@ -74,6 +74,6 @@ with(this){return _c('ul',{staticStyle:{"list-style-type":"none","padding-inline with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Apdx C: FAQ")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('span',[_v("Apdx E: Using GitHub "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/appendixE-gitHub.html b/admin/appendixE-gitHub.html index 0d87468dbc..5d6836e3f2 100644 --- a/admin/appendixE-gitHub.html +++ b/admin/appendixE-gitHub.html @@ -47,7 +47,7 @@
    • Follow the Best practices for reviewing PRs @SE-EDU/guides.
    • Give comments at specific locations of the code changes, in addition to adding an overall comment for the entire PR. Reason: location-specific comments are valued more in grading.
    • LGTM is common abbreviation you can use in the review comments to mean Looks Good To Me.

    Merging PRs:

    • Do not merge PRs failing . The CI status of a PR is reported at the bottom of the conversation tab of the PR page. Here's an example:
      • If there is a failure, you can click on the Details link in corresponding line to find out more about the failure. Once you figure out the cause of the failure, push a fix to the PR.
      • An exception to this guideline is when the failure is confirmed to be due to something you can afford to ignore e.g., when CI fails due to a drop in code coverage but the code section that is causing the coverage drop is not practical to be covered by automated tests, or you plan to write the relevant tests at a later time.
    • Avoid rebasing/squashing when merging PRs. While both are good alternatives to the default behavior of creating a merge commit, rebasing/squashing can affect the timestamp of the commits, which can interfere with the progress tracking that we do for grading purposes i.e., the commits can get detected under a week different from the week they were actually done.
    • After merging a PR,
      • close the corresponding issue (which should happen automatically, if you followed this trick).
      • sync your individual repos/forks with the team repo as follows:
        • Pull the latest master from the team repo, and push it to your own fork.
        • If there are any unmerged branches in your local repo, for each of them,
          -merge master branch to it, and push the updated branch to your fork.
          Another way to sync a branch with the master branch is to rebase it. But we discourage that approach as it will change the timestamp of your branch commits, affecting how our grading scripts track your work.
      • don't delete the branch used by the PR. While it is common practice to delete a branch after merging it, we require you to keep those branches in the team repo so that our scripts can confirm that you used branches when adding changes.

    FAQ Who should merge PRs? e.g., PR author, reviewer, team lead?


    e Using milestones to track iteration progress

    At the start of the iteration:

    • Create milestones to represent the iteration. For example, if your next iteration will produce the version v1.2 of the product, we can create a milestone named v1.1 (for convenience, we use the product version as the milestone name as well).
    • Set a deadline for the milestone. This can be earlier than the deadlines set by the course, to give you a buffer.
    • Create issues for tasks to be done in that iteration.
      Assign them to team members.
      Assign them to the milestone.

    During the iteration:

    • Ensure incoming PRs are assigned to the milestone as well.
      Review and merge PRs, and ensure the corresponding issue is closed when the PR is merged.
    • Adjust iteration targets as necessary, by assigning new issues/PR to the milestone, or removing them from the milestone.

    At the end of the iteration:

    • Update the milestone to match the product i.e. all issues completed and PRs merged for the milestone should be assigned to the milestone. Incomplete issues/PRs should be moved to a future milestone.
    • Do a release (example), if required by the milestone.
    • Close the milestone.

    Apdx D: Getting HelpApdx F: Handling Team Issues

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +merge master branch to it, and push the updated branch to your fork.
    Another way to sync a branch with the master branch is to rebase it. But we discourage that approach as it will change the timestamp of your branch commits, affecting how our grading scripts track your work.
  • don't delete the branch used by the PR. While it is common practice to delete a branch after merging it, we require you to keep those branches in the team repo so that our scripts can confirm that you used branches when adding changes.
  • FAQ Who should merge PRs? e.g., PR author, reviewer, team lead?


    e Using milestones to track iteration progress

    At the start of the iteration:

    • Create milestones to represent the iteration. For example, if your next iteration will produce the version v1.2 of the product, we can create a milestone named v1.1 (for convenience, we use the product version as the milestone name as well).
    • Set a deadline for the milestone. This can be earlier than the deadlines set by the course, to give you a buffer.
    • Create issues for tasks to be done in that iteration.
      Assign them to team members.
      Assign them to the milestone.

    During the iteration:

    • Ensure incoming PRs are assigned to the milestone as well.
      Review and merge PRs, and ensure the corresponding issue is closed when the PR is merged.
    • Adjust iteration targets as necessary, by assigning new issues/PR to the milestone, or removing them from the milestone.

    At the end of the iteration:

    • Update the milestone to match the product i.e. all issues completed and PRs merged for the milestone should be assigned to the milestone. Incomplete issues/PRs should be moved to a future milestone.
    • Do a release (example), if required by the milestone.
    • Close the milestone.

    Apdx D: Getting HelpApdx F: Handling Team Issues

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/appendixE-gitHub.page-vue-render.js b/admin/appendixE-gitHub.page-vue-render.js index ed29014e86..aad07e07a3 100644 --- a/admin/appendixE-gitHub.page-vue-render.js +++ b/admin/appendixE-gitHub.page-vue-render.js @@ -173,6 +173,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Update the milestone to mat with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Apdx D: Getting Help")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('span',[_v("Apdx F: Handling Team Issues "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/appendixF-teamworkIssues.html b/admin/appendixF-teamworkIssues.html index 9cb50173c0..1402b18838 100644 --- a/admin/appendixF-teamworkIssues.html +++ b/admin/appendixF-teamworkIssues.html @@ -21,7 +21,7 @@
  • Apdx E: Using GitHub


    Apdx F: Handling Team Issues : OPTIONAL

    If your team is facing difficulties due to differences in skill/motivation/availability among team members,

    • First, do not expect everyone to have the same skill/motivation level as you. It is fine if someone wants to do less and have low expectations from the course. That doesn't mean that person is a bad person. Everyone is entitled to have their own priorities.

    • Second, don't give up. It is unfortunate that your team ended up in this situation, but you can turn it into a good learning opportunity. You don't get an opportunity to save a sinking team every day 😃

    • Third, if you care about your grade and willing to work for it, you need to take initiative to turn the situation around or else the whole team is going to suffer. Don't hesitate to take charge if the situation calls for it. By doing so, you'll be doing a favor for your team. Be professional, kind, and courteous to the team members, but also be firm and assertive. It is your grade that is at stake. Don't worry about making a bad situation worse. You won't know until you try.

    • Finally, don't feel angry or 'wronged'. Teamwork problems are not uncommon in this course and we know how to grade so that you will not be penalized for others' low contribution. We can use Git to find exactly what others did. It's not your responsibility to get others to contribute. Some folks have genuine problems that prevent them from contributing more although they may not be able tell you the reasons. Just do your best for the project and assume everyone else is doing their best too, although their best may be lower than yours.

    Given below are some suggestions you can adopt if the project work is not going smooth due to team issues. Note that the below measures can result in some team members doing more work than others and earning better project grades than others. It is still better than sinking the whole team together.

    • Adjust targets:

      • Ask how much each person is planning to contribute (e.g., how many hours per week can be dedicated to the tP), especially from those who seem to be contributing less. In addition, you can use past conduct to estimate how much you can expect from each person in the future.
      • Get some idea about how value each person is able to produce. Time doesn't always equal value.
      • Based on the above, estimate how much 'real' manpower you have and and adjust your targets accordingly.
    • Redistribute the work:

      • Stronger programmers in the team can take over the critical parts of the code.
      • Also note that in real software projects, it is not unusual to have less-than-100% members because some people need to divide their time between multiple projects. Treat this as a similar case and adapt accordingly.
    • Enforce stricter integration workflow: If the problem involves low-quality work, appoint an integrator (typically, the strongest programmer). His/her job is to maintain the integrated version of the code. He/she should not accept any code that breaks the existing product or is not up to the acceptable quality standard. It is up to others to submit acceptable code to the integrator.

    If you have very unreliable or totally disengaged team members :

    • Re-allocate to others any mission-critical work allocated to that person so that such team members cannot bring down the entire team.
    • However, do not leave out such team members from project communications. Always keep them in the loop so that they can contribute any time they wish to.
    • If such a member indicates they want to contribute late in the project (by which time you may have redistributed the work to other members), there is no need to disrupt your current plan. Instead, you can suggest (or let the person figure out) ways to contribute without affecting the current project plan. For example, the person can add an additional nice-to-have feature that will not require changes to other features.
    • If such a member offers some code that you believe to be detrimental to the project, you may refuse to merge that code. In that case, that person may contact the teaching team so that the unmerged code can be factored into his/her grading.
    • Furthermore, evaluate them sincerely and fairly during peer evaluations so that they do get the grade their work deserves, no more, no less.
    • Keep the teaching team informed about such members so that it can be factored into your own grading. If appropriate, we'll exclude such team members when calculating your team size, although the team size does not affect most of the tP grade components.
    • Keep copies of your communications with team members, in case we might need to verify exact details of those communications later.

    If you are a 'low contributor' yourself:

    • It goes without saying that the best policy is to keep your team members informed about how much you can contribute, during which periods, (and possibly, the reason for your low contribution).
    • Promise only what you can do, and do what you promised, on time, and up to the expected quality. Sloppy work or late work is worse than no work.
    • If the team refused to accept your work, you can still earn marks for that code. You are allowed to submit such 'rejected' code for grading.

    Apdx E: Using GitHub

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Apdx E: Using GitHub


    Apdx F: Handling Team Issues : OPTIONAL

    If your team is facing difficulties due to differences in skill/motivation/availability among team members,

    • First, do not expect everyone to have the same skill/motivation level as you. It is fine if someone wants to do less and have low expectations from the course. That doesn't mean that person is a bad person. Everyone is entitled to have their own priorities.

    • Second, don't give up. It is unfortunate that your team ended up in this situation, but you can turn it into a good learning opportunity. You don't get an opportunity to save a sinking team every day 😃

    • Third, if you care about your grade and willing to work for it, you need to take initiative to turn the situation around or else the whole team is going to suffer. Don't hesitate to take charge if the situation calls for it. By doing so, you'll be doing a favor for your team. Be professional, kind, and courteous to the team members, but also be firm and assertive. It is your grade that is at stake. Don't worry about making a bad situation worse. You won't know until you try.

    • Finally, don't feel angry or 'wronged'. Teamwork problems are not uncommon in this course and we know how to grade so that you will not be penalized for others' low contribution. We can use Git to find exactly what others did. It's not your responsibility to get others to contribute. Some folks have genuine problems that prevent them from contributing more although they may not be able tell you the reasons. Just do your best for the project and assume everyone else is doing their best too, although their best may be lower than yours.

    Given below are some suggestions you can adopt if the project work is not going smooth due to team issues. Note that the below measures can result in some team members doing more work than others and earning better project grades than others. It is still better than sinking the whole team together.

    • Adjust targets:

      • Ask how much each person is planning to contribute (e.g., how many hours per week can be dedicated to the tP), especially from those who seem to be contributing less. In addition, you can use past conduct to estimate how much you can expect from each person in the future.
      • Get some idea about how value each person is able to produce. Time doesn't always equal value.
      • Based on the above, estimate how much 'real' manpower you have and and adjust your targets accordingly.
    • Redistribute the work:

      • Stronger programmers in the team can take over the critical parts of the code.
      • Also note that in real software projects, it is not unusual to have less-than-100% members because some people need to divide their time between multiple projects. Treat this as a similar case and adapt accordingly.
    • Enforce stricter integration workflow: If the problem involves low-quality work, appoint an integrator (typically, the strongest programmer). His/her job is to maintain the integrated version of the code. He/she should not accept any code that breaks the existing product or is not up to the acceptable quality standard. It is up to others to submit acceptable code to the integrator.

    If you have very unreliable or totally disengaged team members :

    • Re-allocate to others any mission-critical work allocated to that person so that such team members cannot bring down the entire team.
    • However, do not leave out such team members from project communications. Always keep them in the loop so that they can contribute any time they wish to.
    • If such a member indicates they want to contribute late in the project (by which time you may have redistributed the work to other members), there is no need to disrupt your current plan. Instead, you can suggest (or let the person figure out) ways to contribute without affecting the current project plan. For example, the person can add an additional nice-to-have feature that will not require changes to other features.
    • If such a member offers some code that you believe to be detrimental to the project, you may refuse to merge that code. In that case, that person may contact the teaching team so that the unmerged code can be factored into his/her grading.
    • Furthermore, evaluate them sincerely and fairly during peer evaluations so that they do get the grade their work deserves, no more, no less.
    • Keep the teaching team informed about such members so that it can be factored into your own grading. If appropriate, we'll exclude such team members when calculating your team size, although the team size does not affect most of the tP grade components.
    • Keep copies of your communications with team members, in case we might need to verify exact details of those communications later.

    If you are a 'low contributor' yourself:

    • It goes without saying that the best policy is to keep your team members informed about how much you can contribute, during which periods, (and possibly, the reason for your low contribution).
    • Promise only what you can do, and do what you promised, on time, and up to the expected quality. Sloppy work or late work is worse than no work.
    • If the team refused to accept your work, you can still earn marks for that code. You are allowed to submit such 'rejected' code for grading.

    Apdx E: Using GitHub

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/appendixF-teamworkIssues.page-vue-render.js b/admin/appendixF-teamworkIssues.page-vue-render.js index 3a62709ad2..f02b1f953b 100644 --- a/admin/appendixF-teamworkIssues.page-vue-render.js +++ b/admin/appendixF-teamworkIssues.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Apdx E: Using GitHub")])])])]),_v(" "),_c('br'),_v(" "),_c('h1',{attrs:{"id":"apdx-f-handling-team-issues-optional"}},[_c('span',{staticClass:"display-4"},[_v("Apdx F: Handling Team Issues")]),_v(" "),_c('span',{staticClass:"text-muted text-light",staticStyle:{"font-size":"15px"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v(": OPTIONAL")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#apdx-f-handling-team-issues-optional","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('p',[_v("If your team is facing difficulties due to differences in skill/motivation/availability among team members,")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("First, do not expect everyone to have the same skill/motivation level as you.")]),_v(" It is fine if someone wants to do less and have low expectations from the course. That doesn't mean that person is a bad person. Everyone is entitled to have their own priorities.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Second, don't give up.")]),_v(" It is unfortunate that your team ended up in this situation, but you can turn it into a good learning opportunity. You don't get an opportunity to save a sinking team every day 😃")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Third, if you care about your grade and willing to work for it, you need to take initiative")]),_v(" to turn the situation around or else the whole team is going to suffer. Don't hesitate to take charge if the situation calls for it. By doing so, you'll be doing a favor for your team. Be professional, kind, and courteous to the team members, but also be firm and assertive. It is your grade that is at stake. Don't worry about making a bad situation worse. You won't know until you try.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Finally, don't feel angry or 'wronged'.")]),_v(" Teamwork problems are not uncommon in this course and we know how to grade so that you will not be penalized for others' low contribution. We can use Git to find exactly what others did. It's not your responsibility to get others to contribute. Some folks have genuine problems that prevent them from contributing more although they may not be able tell you the reasons. Just do your best for the project and assume everyone else is doing their best too, although their best may be lower than yours.")])])]),_v(" "),_c('p',[_v("Given below are some suggestions you can adopt if the project work is not going smooth due to team issues. Note that the below measures can result in some team members doing more work than others and earning better project grades than others. It is still better than sinking the whole team together.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Adjust targets")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Ask how much each person is planning to contribute (e.g., how many hours per week can be dedicated to the tP), especially from those who seem to be contributing less. In addition, you can use past conduct to estimate how much you can expect from each person in the future.")]),_v(" "),_c('li',[_v("Get some idea about how value each person is able to produce. Time doesn't always equal value.")]),_v(" "),_c('li',[_v("Based on the above, estimate how much 'real' manpower you have and and adjust your targets accordingly.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Redistribute the work")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Stronger programmers in the team can take over the critical parts of the code.")]),_v(" "),_c('li',[_v("Also note that in real software projects, it is not unusual to have less-than-100% members because some people need to divide their time between multiple projects. Treat this as a similar case and adapt accordingly.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Enforce stricter integration workflow")]),_v(": If the problem involves low-quality work, appoint an integrator (typically, the strongest programmer). His/her job is to maintain the integrated version of the code. He/she should not accept any code that breaks the existing product or is not up to the acceptable quality standard. It is up to others to submit acceptable code to the integrator.")])])]),_v(" "),_c('p',[_c('strong',[_v("If you have very unreliable or totally disengaged team members")]),_v(" :")]),_v(" "),_c('ul',[_c('li',[_v("Re-allocate to others any mission-critical work allocated to that person so that such team members cannot bring down the entire team.")]),_v(" "),_c('li',[_v("However, do not leave out such team members from project communications. Always keep them in the loop so that they can contribute any time they wish to.")]),_v(" "),_c('li',[_v("If such a member indicates they want to contribute late in the project (by which time you may have redistributed the work to other members), there is no need to disrupt your current plan. Instead, you can suggest (or let the person figure out) ways to contribute without affecting the current project plan. For example, the person can add an additional nice-to-have feature that will not require changes to other features.")]),_v(" "),_c('li',[_v("If such a member offers some code that you believe to be detrimental to the project, you may refuse to merge that code. In that case, that person may contact the teaching team so that the unmerged code can be factored into his/her grading.")]),_v(" "),_c('li',[_v("Furthermore, evaluate them sincerely and fairly during peer evaluations so that they do get the grade their work deserves, no more, no less.")]),_v(" "),_c('li',[_v("Keep the teaching team informed about such members so that it can be factored into your own grading. If appropriate, we'll exclude such team members when calculating your team size, although the team size does not affect most of the tP grade components.")]),_v(" "),_c('li',[_v("Keep copies of your communications with team members, in case we might need to verify exact details of those communications later.")])]),_v(" "),_c('p',[_c('strong',[_v("If you are a 'low contributor' yourself:")])]),_v(" "),_c('ul',[_c('li',[_v("It goes without saying that the best policy is to keep your team members informed about how much you can contribute, during which periods, (and possibly, the reason for your low contribution).")]),_v(" "),_c('li',[_v("Promise only what you can do, and do what you promised, on time, and up to the expected quality. Sloppy work or late work is worse than no work.")]),_v(" "),_c('li',[_v("If the team refused to accept your work, you can still earn marks for that code. You are allowed to submit such 'rejected' code for grading.")])])]),_v(" "),_c('br'),_v(" "),_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Apdx E: Using GitHub")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/appendixG-CS2103R.html b/admin/appendixG-CS2103R.html index a67205d55a..c6009c9c81 100644 --- a/admin/appendixG-CS2103R.html +++ b/admin/appendixG-CS2103R.html @@ -16,7 +16,7 @@
    • The enhancement can be a change to the current design (the internal design, not the external features), an alternative design, using alternative tools (including different testing/documentation/CI tools), improvements to AB3 learning resources, etc. that can showcase the depth of your SE skills.
    • Simply adding more external features to AB3 is not suitable for this purpose as anyone in the class can do that (as that is what you normally do in the tP anyway) -- here, we are looking for things that can make you stand out from the majority of the class in terms of SE skills. In particular, we want to see your understanding of pros and cons of the current AB3, and to see you explore alternatives to current AB3 choices.
    • The enhancement should be accompanied by a report explaining its rationale, implementation, pros and cons.
    • The proposed enhancement is unlikely (although not impossible) to be incorporated to the actual AB3, as this is more of an opportunity to showcase your SE skills rather than a way to perfect AB3 (using a 'perfect' codebase for the tP may not fit the learning goals of this course after all).
  • Option B: A deliverable that would result in a non-trivial quality-of-life improvement to CS2103/T students and/or instructors even if it doesn't directly involve AB3, provided it also showcases your SE skills beyond what is normally covered in the course. Examples:
    • Some kind of automation that reduces the manual work for students or instructors.
    • Improved versions of instructional materials e.g., JavaFX tutorial, AB3 tutorials
  • Option C: An exploration of how AI tools (e.g., ChatGPT, GitHub Copilot, Codex, etc.) can be used in the iP and the tP by students and instructors. For example, how students can use a tool to save time in doing the project. Even better if you also reflect on how the use of the tool affects various aspects (learning outcomes, fairness of grading, plagiarism concerns etc.) of the course.
  • Workload is expected to be about 50% of your individual tP effort.

    Timeline:

    1. [Weeks 9-11]: Submit a brief proposal (~ 1 page):
      Contents: your name, student number, an outline of the proposed change, expected pros/cons.
      -Submission: Upload a file CS2103R-YOUR_NAME.pdf to the corresponding Canvas assignment.
    2. [Reading week]: You will be notified if you are accepted for CS2103R. As this is the first time we are offering CS2103R in this manner, the number of slots is likely to be small in this round.
    3. [Within 4 weeks of the end of the exam period]: submit the implementation and the report. The grade will be given to you soon after.
    4. [Week 1 of the following semester]: Register for the course, to receive the extra 1 Unit in the following semester. More info about R courses is given here (requires login).

    Grading:

    The grade given is typically the same as the grade you earned for CS2103/T, but can be different if your CS2103R work is substantially better/worse than your CS2103/T performance.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Submission: Upload a file CS2103R-YOUR_NAME.pdf to the corresponding Canvas assignment.
  • [Reading week]: You will be notified if you are accepted for CS2103R. As this is the first time we are offering CS2103R in this manner, the number of slots is likely to be small in this round.
  • [Within 4 weeks of the end of the exam period]: submit the implementation and the report. The grade will be given to you soon after.
  • [Week 1 of the following semester]: Register for the course, to receive the extra 1 Unit in the following semester. More info about R courses is given here (requires login).
  • Grading:

    The grade given is typically the same as the grade you earned for CS2103/T, but can be different if your CS2103R work is substantially better/worse than your CS2103/T performance.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/appendixG-CS2103R.page-vue-render.js b/admin/appendixG-CS2103R.page-vue-render.js index 043535d04b..8848a14e2c 100644 --- a/admin/appendixG-CS2103R.page-vue-render.js +++ b/admin/appendixG-CS2103R.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{attrs:{"id":"main"}},[_c('p',[_c('strong',[_v("CS2103R is an 'R course'")]),_v(" (R stands for Research) that students can take to earn an extra 1 Unit of credit (and can also be used to fulfill requirements of the Turing program). The 1MC is graded (not S/U).")]),_v(" "),_c('p',[_c('strong',[_v("It is meant for strong programmers who would like to push themselves beyond the achievement bars set by CS2103/T")]),_v(", keeping in mind that the regular 4-Units course deliberately does not give extra credit for exceeding expectations (reason: to keep the workload manageable for the majority of students). CS2103R is an opportunity to work around that limitation, and get extra 1MC by doing some extra work.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Deliverables")])]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Option A")]),_v(": Propose and implement an enhancement to the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/"}},[_v("AB3 base project")]),_v(".\n"),_c('ul',[_c('li',[_v("The enhancement can be a change to the current design (the "),_c('em',[_v("internal")]),_v(" design, not the external features), an alternative design, using alternative tools (including different testing/documentation/CI tools), improvements to AB3 learning resources, etc. that can showcase the depth of your SE skills."),_c('br')]),_v(" "),_c('li',[_v("Simply adding more external features to AB3 is not suitable for this purpose as anyone in the class can do that (as that is what you normally do in the tP anyway) -- here, "),_c('mark',[_v("we are looking for things that can make you stand out from the majority of the class in terms of SE skills")]),_v(". In particular, we want to see your understanding of pros and cons of the current AB3, and to see you explore alternatives to current AB3 choices.")]),_v(" "),_c('li',[_v("The enhancement should be accompanied by a report explaining its rationale, implementation, pros and cons.")]),_v(" "),_c('li',[_v("The proposed enhancement is unlikely (although not impossible) to be incorporated to the actual AB3, as this is more of an opportunity to showcase your SE skills rather than a way to perfect AB3 (using a 'perfect' codebase for the tP may not fit the learning goals of this course after all).")])])]),_v(" "),_c('li',[_c('strong',[_v("Option B")]),_v(": A deliverable that would result in a non-trivial quality-of-life improvement to CS2103/T students and/or instructors even if it doesn't directly involve AB3, provided it also showcases your SE skills beyond what is normally covered in the course. Examples:\n"),_c('ul',[_c('li',[_v("Some kind of automation that reduces the manual work for students or instructors.")]),_v(" "),_c('li',[_v("Improved versions of instructional materials e.g., JavaFX tutorial, AB3 tutorials")])])]),_v(" "),_c('li',[_c('strong',[_v("Option C")]),_v(": An exploration of how AI tools (e.g., ChatGPT, GitHub Copilot, Codex, etc.) can be used in the iP and the tP by students and instructors. For example, how students can use a tool to save time in doing the project. Even better if you also reflect on how the use of the tool affects various aspects (learning outcomes, fairness of grading, plagiarism concerns etc.) of the course.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Workload")])]),_v(" is expected to be about 50% of your individual tP effort.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Timeline")])]),_v(":")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("[Weeks 9-11]")]),_v(": Submit a brief proposal (~ 1 page):"),_c('br'),_v("\nContents: your name, student number, an outline of the proposed change, expected pros/cons."),_c('br'),_v("\nSubmission: Upload a file "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103R-YOUR_NAME.pdf")]),_v(" to the corresponding Canvas assignment.")]),_v(" "),_c('li',[_c('strong',[_v("[Reading week]")]),_v(": You will be notified if you are accepted for CS2103R. As this is the first time we are offering CS2103R in this manner, the number of slots is likely to be small in this round.")]),_v(" "),_c('li',[_c('strong',[_v("[Within 4 weeks of the end of the exam period]")]),_v(": submit the implementation and the report. The grade will be given to you soon after.")]),_v(" "),_c('li',[_c('strong',[_v("[Week 1 of the following semester]")]),_v(": Register for the course, to receive the extra 1 Unit in the following semester. More info about R courses is given "),_c('a',{attrs:{"href":"https://wiki.nus.edu.sg/pages/viewpage.action?spaceKey=SUW&title=R+Modules"}},[_v("here")]),_v(" (requires login).")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Grading")])]),_v(":")]),_v(" "),_c('p',[_v("The grade given is typically the same as the grade you earned for CS2103/T, but can be different if your CS2103R work is substantially better/worse than your CS2103/T performance.")])]),_v(" "),_c('br')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/courseBriefings.html b/admin/courseBriefings.html index 00a3862a1d..f5f34720a3 100644 --- a/admin/courseBriefings.html +++ b/admin/courseBriefings.html @@ -22,7 +22,7 @@
  • Course ExpectationsWeekly Schedule


    Course Briefing Videos

    Course briefing videos cover general admin instructions and aim to guide you on important components of the course.

    Course briefings are delivered as pre-recorded videos, so that they can be made shorter, and you can speed-watch them if you wish, to save time.

    Most course briefing videos are categorized MUST-WATCH as they contain important information that you need to know to increase your effort-to-gain ratio, and get the best out of this course.

    They are listed below for reference only. When it is time for you to watch a certain course briefing video, it will appear in the current schedule page of the course website.

    Week 1 Course Briefings

    Watching course briefing videos counts for participation.
    -When watching a briefing video for the first time, avoid or jumping ahead/around in the video timeline, as this can interfere with the video platform's capturing of what part of the video you actually watched. However, watching at faster speeds is fine.

    We have added closed captioning support for course briefing videos.

    1. Welcome to the Course:

    Video 1 min

    2. Course Goals: How the goals of this course shape its structure (possibly different from other courses), and how it should be approached by students.

    Video 9 mins

    3. Week 1 Briefing: As this is the first weekly briefing, it also covers some general points relevant to all future weeks.

    Video 4 mins


    Week 2 Course Briefings

    This week's briefing videos start with a detour.


    0. Detour: SDLC Basics: Watch the following video covering the week 2 topic 'SDLC Process Models Basics', as the concepts covered in there are referenced in the rest of the course briefing.

    Video 6 mins -- Detour: SDLC Basics


    1. Iterative + Brownfield = ???: How the iterative and brownfield approach taken by the course impacts your learning experience.

    Video 6 mins

    2. Challenges and Solutions: How to tackle three challenges you'll face in the course, namely, information overload, workload, and technical problems.

    Video 11 mins


    3. Week 1->2 Briefing (Week 1 Recap + Week 2 Preview): This video recaps Week 1 and gives a preview of what you need to do in Week 2.
    Note: While weekly briefings are normally done in hybrid mode, this week's briefing is released as a pre-recorded video, to allow you to get started with week 2 tasks early.

    Video 4 mins


    Week 3 Course Briefings

    CS2103/T Pitfalls (and how to avoid them)

    Video 9 mins


    Week 4 Course Briefings

    tP Briefing (Part 1 -- Getting Started)

    Video 9 mins


    Week 7 Course Briefings

    Noticed anything odd about the videos below?

    In these two videos, we used an AI-driven text-to-speech tool to create some parts of the narrations, as an experiment. See if you can spot which parts are AI-generated and which parts are not.

    tP Briefing (Part 2a -- v1.1, Workflow)

    Video 6 mins

    tP Briefing (Part 2b -- v1.2-v1.6, PE, Grading, Workload)

    Video 6 mins


    Week 13 Course Briefings

    Final Exam: This video contains an overview of the final exam structure and resources that you can use to prepare for it.

    Video Video will be released closer to week 13 ...

    Course Topics Recap aka the 'Big Picture': This video explains how course topics fit into a big picture, and as a bonus, touches on some exam-like questions as well.

    Video Video will be released closer to week 13 ...



    Course ExpectationsWeekly Schedule

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +When watching a briefing video for the first time, avoid or jumping ahead/around in the video timeline, as this can interfere with the video platform's capturing of what part of the video you actually watched. However, watching at faster speeds is fine.

    We have added closed captioning support for course briefing videos.

    1. Welcome to the Course:

    Video 1 min

    2. Course Goals: How the goals of this course shape its structure (possibly different from other courses), and how it should be approached by students.

    Video 9 mins

    3. Week 1 Briefing: As this is the first weekly briefing, it also covers some general points relevant to all future weeks.

    Video 4 mins


    Week 2 Course Briefings

    This week's briefing videos start with a detour.


    0. Detour: SDLC Basics: Watch the following video covering the week 2 topic 'SDLC Process Models Basics', as the concepts covered in there are referenced in the rest of the course briefing.

    Video 6 mins -- Detour: SDLC Basics


    1. Iterative + Brownfield = ???: How the iterative and brownfield approach taken by the course impacts your learning experience.

    Video 6 mins

    2. Challenges and Solutions: How to tackle three challenges you'll face in the course, namely, information overload, workload, and technical problems.

    Video 11 mins


    3. Week 1->2 Briefing (Week 1 Recap + Week 2 Preview): This video recaps Week 1 and gives a preview of what you need to do in Week 2.
    Note: While weekly briefings are normally done in hybrid mode, this week's briefing is released as a pre-recorded video, to allow you to get started with week 2 tasks early.

    Video 4 mins


    Week 3 Course Briefings

    CS2103/T Pitfalls (and how to avoid them)

    Video 9 mins


    Week 4 Course Briefings

    tP Briefing (Part 1 -- Getting Started)

    Video 9 mins


    Week 7 Course Briefings

    Noticed anything odd about the videos below?

    In these two videos, we used an AI-driven text-to-speech tool to create some parts of the narrations, as an experiment. See if you can spot which parts are AI-generated and which parts are not.

    tP Briefing (Part 2a -- v1.1, Workflow)

    Video 6 mins

    tP Briefing (Part 2b -- v1.2-v1.6, PE, Grading, Workload)

    Video 6 mins


    Week 13 Course Briefings

    Final Exam: This video contains an overview of the final exam structure and resources that you can use to prepare for it.

    Video Video will be released closer to week 13 ...

    Course Topics Recap aka the 'Big Picture': This video explains how course topics fit into a big picture, and as a bonus, touches on some exam-like questions as well.

    Video Video will be released closer to week 13 ...



    Course ExpectationsWeekly Schedule

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/courseBriefings.page-vue-render.js b/admin/courseBriefings.page-vue-render.js index 9a5a921d6b..24dffd36e9 100644 --- a/admin/courseBriefings.page-vue-render.js +++ b/admin/courseBriefings.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("They are listed below for reference o with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/courseExpectations.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Course Expectations")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('span',[_v("Weekly Schedule "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/courseExpectations.html b/admin/courseExpectations.html index f0e61640ef..c5e4f95c1c 100644 --- a/admin/courseExpectations.html +++ b/admin/courseExpectations.html @@ -22,7 +22,7 @@
  • Using this WebsiteCourse Briefing Videos


    Course Expectations

    Here are some important expectations of the course from you.

    Prior Knowledge: Java and OOP

    This course requires you to write Java code almost every week, starting from the very first week. If your Java skills are rusty, do brush up your Java programming skills.

    In particular, you may want to have a look at the new Java features such as streams, lambdas, Optionals, that may not have been covered in previous Java courses.

    Workload

    As 70% of this course is based on CA (see grade breakdown), it can appear to be heavy. However, it is not expected that you will spend more time on this course than its .

    • Note that the course contains more things than a typical students can do, in order to provide enough things for even the strongest students to learn as much as they wish to.
    • This means it is perfectly OK if you don't have time to learn everything the course offers. Control your workload based on time you spend for the course in a week e.g., 1-1.5 days per week.
    • We have provided a topic levels (explained below) to guide you when prioritizing which things to do.

    Topic Levels

    We use a topic levels system to indicate the progression of course components. Start with things that are rated level-1 and progress to topics at higher levels. Things rated level-4 are optional.

    Levels for lesson topics (and textbook sections):

    • Level-1 topics are essential to keep up with the course. We recommend you to learn these topics if you want to pass the course (i.e. up to a C grade).
    • Level-2 topics can get you up to a B+.
    • Level-3 topics can get you up to an A.
    • Level-4 topics : OPTIONAL can push you beyond the limits of the course, and help you get into a level above those who merely limit themselves to the topics of the course. They are not .
    • Topics marked with two icons e.g., : , : , : are relevant topics you are expected to have learned in prerequisite courses. They are given for reference, but are examinable. The number of indicates the progression of prerequisite topics, similar to the topic levels system above i.e., level-1 prerequisite topics are the most basic and the most important. level-4 prerequisite topics can be ignored without affecting GPA. -

    Topic levels for other things e.g., admin info sections:

    • The course uses a similar topic levels system to indicate the importance of other info in this website. i.e., information rated as level-1 are the most essential. Info rated level-4 are non-essential and can be ignored without affecting your ability to follow the course.

    Rewards for exceeding expectations

    This course deliberately avoids giving extra credit for exceeding the expected bars, in order to keep the workload manageable (of course, doing more will have their own rewards in terms of learning).


    Using this WebsiteCourse Briefing Videos

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Topic levels for other things e.g., admin info sections:

    • The course uses a similar topic levels system to indicate the importance of other info in this website. i.e., information rated as level-1 are the most essential. Info rated level-4 are non-essential and can be ignored without affecting your ability to follow the course.

    Rewards for exceeding expectations

    This course deliberately avoids giving extra credit for exceeding the expected bars, in order to keep the workload manageable (of course, doing more will have their own rewards in terms of learning).


    Using this WebsiteCourse Briefing Videos

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/courseExpectations.page-vue-render.js b/admin/courseExpectations.page-vue-render.js index d3639f69b5..3fd359c8c5 100644 --- a/admin/courseExpectations.page-vue-render.js +++ b/admin/courseExpectations.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('div',{attrs:{"tags":"m--cs2103"}},[_c('h4',{attrs:{"id":"r with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Using this Website")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('span',[_v("Course Briefing Videos "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/courseOverview.html b/admin/courseOverview.html index 7288a5e888..368838beea 100644 --- a/admin/courseOverview.html +++ b/admin/courseOverview.html @@ -21,7 +21,7 @@
  • Using this Website


    CS2103/T: Software Engineering

    A balanced, iterative, and brownfield introduction to Software Engineering...

    CS2103/T is an introductory Software Engineering course. It has a 50-50 balance of basic SE theory knowledge and practical skills that you need to gain before industry internships or . The course follows an to covering topics. It is also one of the rare SE courses that includes a , in addition to a .

    • On the theory side, this course is supported by a customized online textbook Software Engineering for Self-Directed Learners, integrated into this course website.

    • The practice side, you will first ramp up your technical skills by doing a small individual project (greenfield) in which you will develop a personal assistant chatbot called Duke. Then, you will move to a team project (brownfield) in which you will take over an existing project AddressBook-Level3 (AB3) -- a relatively small yet non-trivial (6 ) generic product -- and enhance it into a better product or evolve it in a direction that you choose.

    What does mean to 'follow an iterative approach in covering topics'?

    It means, we cover a little bit of at first and then iteratively go deeper into them later, revisiting each aspect many times over the course of the semester. In contrast, a sequential approach would have covered one SE aspect before moving to the next (e.g., teach the requirements aspect completely before moving to the design aspect).

    In each week, we cover topics that are most relevant to the project tasks that you are expected to do around that time.

    This way of 'jumping around' topics feels chaotic but consider the benefits:

    • It allows you to start doing SE projects early, and do it iteratively too. That is, you can start with a small project from the very start and make it bigger progressively, learning from earlier mistakes, and getting multiple chances to improve on previous attempts.
    • Important SE aspects such as testing can be practiced from the very beginning. If we followed a sequential approach, you can only learn it near the end of the semester.
    • It lowers the risk of missing out some SE aspects altogether. For example, suppose your schedule got heavier in the second half of the semester, and you could barely keep up with the course during that half. You still go away with the basic knowledge of all SE aspects rather than knowing some aspects deeply while missing some other aspects altogether.

    To help you cope with the non-sequential progression of topics, this course website contains two versions of the topics.

    1. In the Schedule page, you'll find the topics organized into the order we cover them in each week.
    2. In the Textbook page, you'll find the topics in their natural sequential order. This format is suitable for exam reference.

    Given below is a summary of what the course covers and does not cover.

    Topic Covered Not covered
    Java Used heavily, but not taught syntax (reason: expected prerequisite knowledge)
    OOP Used in a non-trivial project, basics (reason: expected prerequisite knowledge)
    SE tools/practices those specific to start-ups
    Modeling (sufficient to be able to describe SE artifacts using models, such as seen in this Developer Guide of AB3) intensive
    Requirements to gather and document project requirements rapid prototyping, heavy UI design, designing a product from scratch
    Documentation Documentation targeting end users (example) as well as those targeting developers (example) Marketing materials
    Project Management Iterative delivery of a product, working collaboratively with team members, on-site as well as remotely Setting up project infrastructure from scratch
    Testing and
    Applications domains Cross-platform desktop applications Web programming, Mobile programming, Database programming

    FAQ What are the differences between CS2103T and CS2103?



    Using this Website

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Using this Website


    CS2103/T: Software Engineering

    A balanced, iterative, and brownfield introduction to Software Engineering...

    CS2103/T is an introductory Software Engineering course. It has a 50-50 balance of basic SE theory knowledge and practical skills that you need to gain before industry internships or . The course follows an to covering topics. It is also one of the rare SE courses that includes a , in addition to a .

    • On the theory side, this course is supported by a customized online textbook Software Engineering for Self-Directed Learners, integrated into this course website.

    • The practice side, you will first ramp up your technical skills by doing a small individual project (greenfield) in which you will develop a personal assistant chatbot called Duke. Then, you will move to a team project (brownfield) in which you will take over an existing project AddressBook-Level3 (AB3) -- a relatively small yet non-trivial (6 ) generic product -- and enhance it into a better product or evolve it in a direction that you choose.

    What does mean to 'follow an iterative approach in covering topics'?

    It means, we cover a little bit of at first and then iteratively go deeper into them later, revisiting each aspect many times over the course of the semester. In contrast, a sequential approach would have covered one SE aspect before moving to the next (e.g., teach the requirements aspect completely before moving to the design aspect).

    In each week, we cover topics that are most relevant to the project tasks that you are expected to do around that time.

    This way of 'jumping around' topics feels chaotic but consider the benefits:

    • It allows you to start doing SE projects early, and do it iteratively too. That is, you can start with a small project from the very start and make it bigger progressively, learning from earlier mistakes, and getting multiple chances to improve on previous attempts.
    • Important SE aspects such as testing can be practiced from the very beginning. If we followed a sequential approach, you can only learn it near the end of the semester.
    • It lowers the risk of missing out some SE aspects altogether. For example, suppose your schedule got heavier in the second half of the semester, and you could barely keep up with the course during that half. You still go away with the basic knowledge of all SE aspects rather than knowing some aspects deeply while missing some other aspects altogether.

    To help you cope with the non-sequential progression of topics, this course website contains two versions of the topics.

    1. In the Schedule page, you'll find the topics organized into the order we cover them in each week.
    2. In the Textbook page, you'll find the topics in their natural sequential order. This format is suitable for exam reference.

    Given below is a summary of what the course covers and does not cover.

    Topic Covered Not covered
    Java Used heavily, but not taught syntax (reason: expected prerequisite knowledge)
    OOP Used in a non-trivial project, basics (reason: expected prerequisite knowledge)
    SE tools/practices those specific to start-ups
    Modeling (sufficient to be able to describe SE artifacts using models, such as seen in this Developer Guide of AB3) intensive
    Requirements to gather and document project requirements rapid prototyping, heavy UI design, designing a product from scratch
    Documentation Documentation targeting end users (example) as well as those targeting developers (example) Marketing materials
    Project Management Iterative delivery of a product, working collaboratively with team members, on-site as well as remotely Setting up project infrastructure from scratch
    Testing and
    Applications domains Cross-platform desktop applications Web programming, Mobile programming, Database programming

    FAQ What are the differences between CS2103T and CS2103?



    Using this Website

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/courseOverview.page-vue-render.js b/admin/courseOverview.page-vue-render.js index 5b94da76db..990232d2c9 100644 --- a/admin/courseOverview.page-vue-render.js +++ b/admin/courseOverview.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('tr',[_c('td',[_v("Applications domains")]),_v(" "),_c('td' with(this){return _c('p',[_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('span',[_v("Using this Website "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/exam-pen-and-paper.html b/admin/exam-pen-and-paper.html index ef177f3d6f..5ab8708ca3 100644 --- a/admin/exam-pen-and-paper.html +++ b/admin/exam-pen-and-paper.html @@ -19,7 +19,7 @@ Unless stated otherwise, the meaning of answer options are
    A: Agree. If the question has multiple statements, agree with all of them.
    B: Disagree. If the question has multiple statements, disagree with at least one of them

    Here is an example:

    Q23: Java can be used to write OOP code.

    The answer should be A (i.e., Agree).

    Here is another example:

    Q24: Testing is a QA activity. It is done by testers only.

    As the first statement is true but the second is not, the answer should be B (i.e., Disagree).

    A small number of questions will provide custom options to choose from.

    Here is one more example that has specific options to choose from, rather than the default Agree/Disagree.

    Q25: The course project was done using the _____ paradigm.
    [A] Procedural   [B] Functional    [C] OOP

    Answer: C

    You will be given OCR forms (i.e., bubble sheets) to indicate your answers for Part 1.

    You have slightly more than 1 minute for each question, which means you need to go through the questions fairly quickly. You might not have a lot of time left to refer notes frequently during this part of the exam (i.e., you need to be fairly familiar with the content, needing to refer to notes only occasionally).
    That said, based on our past observations, almost all students are able to finish this part of the exam withing the given time fairly comfortably.

    Mark the OCR form as you go, rather than planning to transfer your answers to the OCR form near the end. Reason: Given there are 50 questions, it will be hard to estimate how much time you need to mass-transfer all answers to OCR forms.

    Write the answer in the exam paper as well when marking it in the OCR form. Reason: It will reduce the chance of missing a question. Furthermore, in case you missed a question, it will help you correct the OCR form quickly.

    We have tried to avoid deliberately misleading/tricky questions. If a question seems to take a very long time to figure out, you are probably over-thinking it.

    Invigilators will not answer queries about the questions in the exam paper part 1 (but will answer queries related to exam administration). Reason: Given the fast pace required by this part of the exam, it may be difficult to reach exam takers quickly enough, or to ensure all students receive the same level of access to the invigilator during the exam.

    • If you have a doubt/query about a question, or would like to make an assumption about a question, or would like to report a potential error in the exam paper, write down your doubt/query/assumption in the space provided for it at the end of the exam paper.
    • Those doubts/queries/assumptions (if justified) will be taken into account when grading.

    Final Exam: Part 2 (Essay)

    • Some examples of the nature of questions you can expect: -
      • Draw UML diagrams to match the given code/description
      • Specify requirements for a given project using various formats covered in the course
      • Design test cases to test a given function.
    • Yes, you may use pencils when answering part 2.
    • If you have any queries during this part of the exam, you may ask the invigilator for clarifications.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Draw UML diagrams to match the given code/description
    • Specify requirements for a given project using various formats covered in the course
    • Design test cases to test a given function.
  • Yes, you may use pencils when answering part 2.
  • If you have any queries during this part of the exam, you may ask the invigilator for clarifications.
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/exam-pen-and-paper.page-vue-render.js b/admin/exam-pen-and-paper.page-vue-render.js index e305fc8814..e0690215fd 100644 --- a/admin/exam-pen-and-paper.page-vue-render.js +++ b/admin/exam-pen-and-paper.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('h2',{attrs:{"id":"final-exam-part-2-essay"}},[_v("Final Ex with(this){return _c('ul',[_c('li',[_v("Some examples of the nature of questions you can expect:\n"),_c('ul',[_c('li',[_v("Draw UML diagrams to match the given code/description")]),_v(" "),_c('li',[_v("Specify requirements for a given project using various formats covered in the course")]),_v(" "),_c('li',[_v("Design test cases to test a given function.")])])]),_v(" "),_c('li',[_c('strong',[_v("Yes, you may use pencils")]),_v(" when answering part 2.")]),_v(" "),_c('li',[_v("If you have any queries during this part of the exam, you may ask the invigilator for clarifications.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/exams-f2f.html b/admin/exams-f2f.html index 71cf39f1fa..f028ea8b6a 100644 --- a/admin/exams-f2f.html +++ b/admin/exams-f2f.html @@ -98,7 +98,7 @@ The answer is A, B, C.

    [SELECT ALL] Which are UML diagrams covered in the course?.

    A. Class diagrams.
    B. Object diagrams.
    C. Activity diagrams.
    -D. Gantt charts.


    Final exam - part 2

    • Similar to part 1 (e.g., 16 questions, same length).

    Exam briefing, mock exam, practice exam paper

    • There will be an exam briefing in the penultimate weekly briefing. It will include a minimal mock exam, just to help you understand the structure.
    • You will be given a practice exam paper (at least half the size of the full paper) to help you practice timing. That practice paper will be released at least one week before the exam.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +D. Gantt charts.


    Final exam - part 2

    • Similar to part 1 (e.g., 16 questions, same length).

    Exam briefing, mock exam, practice exam paper

    • There will be an exam briefing in the penultimate weekly briefing. It will include a minimal mock exam, just to help you understand the structure.
    • You will be given a practice exam paper (at least half the size of the full paper) to help you practice timing. That practice paper will be released at least one week before the exam.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/exams-f2f.page-vue-render.js b/admin/exams-f2f.page-vue-render.js index 579fa4c035..2b40663441 100644 --- a/admin/exams-f2f.page-vue-render.js +++ b/admin/exams-f2f.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('h2',{attrs:{"id":"exam-briefing-mock-exam-practice-exam-pa with(this){return _c('ul',[_c('li',[_v("There will be an exam briefing in the penultimate weekly briefing. It will include a minimal mock exam, just to help you understand the structure.")]),_v(" "),_c('li',[_v("You will be given a practice exam paper (at least half the size of the full paper) to help you practice timing. That practice paper will be released at least one week before the exam.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/exams.html b/admin/exams.html index dc97e5d7fd..c1a4e44b4d 100644 --- a/admin/exams.html +++ b/admin/exams.html @@ -122,7 +122,7 @@ You can retake them to self-test your knowledge (note: retaking them will not affect participation marks).
  • Recordings of all tutorial Zoom sessions should be available in a file named Recordings.docx inside your tutorial group's MS Team (in the 'Files' section). Remind your tutor to update that file if recording links are missing.
  • Recordings of all weekly briefings are available on the Canvas home page.
  • The Topics Overview video given below explains how course topics fit into a big picture, and as a bonus, touches on some exam-like questions as well.
  • Video Video will be released closer to week 13 ...

    • PDF files useful for the exam (given in Canvas/files/handouts): -
      • Exam Reference PDF
      • Topics infographic (shows how the various topics fit into the big picture)

    ToolsParticipation Marks

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Exam Reference PDF
    • Topics infographic (shows how the various topics fit into the big picture)

    ToolsParticipation Marks

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/exams.page-vue-render.js b/admin/exams.page-vue-render.js index 23ed3e9d4b..e835f61ad3 100644 --- a/admin/exams.page-vue-render.js +++ b/admin/exams.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("PDF files useful for the ex with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tools.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Tools")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/participation.html"}},[_c('span',[_v("Participation Marks "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/gradeBreakdown.html b/admin/gradeBreakdown.html index 40fd0403a0..48aef0d1a2 100644 --- a/admin/gradeBreakdown.html +++ b/admin/gradeBreakdown.html @@ -27,7 +27,7 @@ "Individual Project (iP)" : 15 "Team Project (tP)" : 50 "exam" : 30 -

    Admin Participation Marks


    Admin Individual Project (iP) Grading


    Admin Team Project (tP) Grading


    Admin Exams



    Participation MarksApdx A: Course Principles

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Admin Participation Marks


    Admin Individual Project (iP) Grading


    Admin Team Project (tP) Grading


    Admin Exams



    Participation MarksApdx A: Course Principles

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/gradeBreakdown.page-vue-render.js b/admin/gradeBreakdown.page-vue-render.js index 42e66485c5..8295949285 100644 --- a/admin/gradeBreakdown.page-vue-render.js +++ b/admin/gradeBreakdown.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"grade-breakdown"}},[_c('span',{staticCla with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/participation.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Participation Marks")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('span',[_v("Apdx A: Course Principles "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/index.html b/admin/index.html index 5b35692690..707f409359 100644 --- a/admin/index.html +++ b/admin/index.html @@ -21,7 +21,7 @@
  • Using this Website


    CS2103/T: Software Engineering

    A balanced, iterative, and brownfield introduction to Software Engineering...

    CS2103/T is an introductory Software Engineering course. It has a 50-50 balance of basic SE theory knowledge and practical skills that you need to gain before industry internships or . The course follows an to covering topics. It is also one of the rare SE courses that includes a , in addition to a .

    • On the theory side, this course is supported by a customized online textbook Software Engineering for Self-Directed Learners, integrated into this course website.

    • The practice side, you will first ramp up your technical skills by doing a small individual project (greenfield) in which you will develop a personal assistant chatbot called Duke. Then, you will move to a team project (brownfield) in which you will take over an existing project AddressBook-Level3 (AB3) -- a relatively small yet non-trivial (6 ) generic product -- and enhance it into a better product or evolve it in a direction that you choose.

    What does mean to 'follow an iterative approach in covering topics'?

    It means, we cover a little bit of at first and then iteratively go deeper into them later, revisiting each aspect many times over the course of the semester. In contrast, a sequential approach would have covered one SE aspect before moving to the next (e.g., teach the requirements aspect completely before moving to the design aspect).

    In each week, we cover topics that are most relevant to the project tasks that you are expected to do around that time.

    This way of 'jumping around' topics feels chaotic but consider the benefits:

    • It allows you to start doing SE projects early, and do it iteratively too. That is, you can start with a small project from the very start and make it bigger progressively, learning from earlier mistakes, and getting multiple chances to improve on previous attempts.
    • Important SE aspects such as testing can be practiced from the very beginning. If we followed a sequential approach, you can only learn it near the end of the semester.
    • It lowers the risk of missing out some SE aspects altogether. For example, suppose your schedule got heavier in the second half of the semester, and you could barely keep up with the course during that half. You still go away with the basic knowledge of all SE aspects rather than knowing some aspects deeply while missing some other aspects altogether.

    To help you cope with the non-sequential progression of topics, this course website contains two versions of the topics.

    1. In the Schedule page, you'll find the topics organized into the order we cover them in each week.
    2. In the Textbook page, you'll find the topics in their natural sequential order. This format is suitable for exam reference.

    Given below is a summary of what the course covers and does not cover.

    Topic Covered Not covered
    Java Used heavily, but not taught syntax (reason: expected prerequisite knowledge)
    OOP Used in a non-trivial project, basics (reason: expected prerequisite knowledge)
    SE tools/practices those specific to start-ups
    Modeling (sufficient to be able to describe SE artifacts using models, such as seen in this Developer Guide of AB3) intensive
    Requirements to gather and document project requirements rapid prototyping, heavy UI design, designing a product from scratch
    Documentation Documentation targeting end users (example) as well as those targeting developers (example) Marketing materials
    Project Management Iterative delivery of a product, working collaboratively with team members, on-site as well as remotely Setting up project infrastructure from scratch
    Testing and
    Applications domains Cross-platform desktop applications Web programming, Mobile programming, Database programming

    FAQ What are the differences between CS2103T and CS2103?



    Using this Website

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Using this Website


    CS2103/T: Software Engineering

    A balanced, iterative, and brownfield introduction to Software Engineering...

    CS2103/T is an introductory Software Engineering course. It has a 50-50 balance of basic SE theory knowledge and practical skills that you need to gain before industry internships or . The course follows an to covering topics. It is also one of the rare SE courses that includes a , in addition to a .

    • On the theory side, this course is supported by a customized online textbook Software Engineering for Self-Directed Learners, integrated into this course website.

    • The practice side, you will first ramp up your technical skills by doing a small individual project (greenfield) in which you will develop a personal assistant chatbot called Duke. Then, you will move to a team project (brownfield) in which you will take over an existing project AddressBook-Level3 (AB3) -- a relatively small yet non-trivial (6 ) generic product -- and enhance it into a better product or evolve it in a direction that you choose.

    What does mean to 'follow an iterative approach in covering topics'?

    It means, we cover a little bit of at first and then iteratively go deeper into them later, revisiting each aspect many times over the course of the semester. In contrast, a sequential approach would have covered one SE aspect before moving to the next (e.g., teach the requirements aspect completely before moving to the design aspect).

    In each week, we cover topics that are most relevant to the project tasks that you are expected to do around that time.

    This way of 'jumping around' topics feels chaotic but consider the benefits:

    • It allows you to start doing SE projects early, and do it iteratively too. That is, you can start with a small project from the very start and make it bigger progressively, learning from earlier mistakes, and getting multiple chances to improve on previous attempts.
    • Important SE aspects such as testing can be practiced from the very beginning. If we followed a sequential approach, you can only learn it near the end of the semester.
    • It lowers the risk of missing out some SE aspects altogether. For example, suppose your schedule got heavier in the second half of the semester, and you could barely keep up with the course during that half. You still go away with the basic knowledge of all SE aspects rather than knowing some aspects deeply while missing some other aspects altogether.

    To help you cope with the non-sequential progression of topics, this course website contains two versions of the topics.

    1. In the Schedule page, you'll find the topics organized into the order we cover them in each week.
    2. In the Textbook page, you'll find the topics in their natural sequential order. This format is suitable for exam reference.

    Given below is a summary of what the course covers and does not cover.

    Topic Covered Not covered
    Java Used heavily, but not taught syntax (reason: expected prerequisite knowledge)
    OOP Used in a non-trivial project, basics (reason: expected prerequisite knowledge)
    SE tools/practices those specific to start-ups
    Modeling (sufficient to be able to describe SE artifacts using models, such as seen in this Developer Guide of AB3) intensive
    Requirements to gather and document project requirements rapid prototyping, heavy UI design, designing a product from scratch
    Documentation Documentation targeting end users (example) as well as those targeting developers (example) Marketing materials
    Project Management Iterative delivery of a product, working collaboratively with team members, on-site as well as remotely Setting up project infrastructure from scratch
    Testing and
    Applications domains Cross-platform desktop applications Web programming, Mobile programming, Database programming

    FAQ What are the differences between CS2103T and CS2103?



    Using this Website

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/index.page-vue-render.js b/admin/index.page-vue-render.js index b449882f82..23590d5dc1 100644 --- a/admin/index.page-vue-render.js +++ b/admin/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('tr',[_c('td',[_v("Applications domains")]),_v(" "),_c('td' with(this){return _c('p',[_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('span',[_v("Using this Website "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/instructors.html b/admin/instructors.html index 2038002bb4..845d41d3f8 100644 --- a/admin/instructors.html +++ b/admin/instructors.html @@ -21,7 +21,7 @@
  • TutorialsTextbooks


    Instructors : OPTIONAL

    Staff

    Damith Chatura RAJAPAKSE

    Course Coordinator
    damith[at]comp.nus.edu.sg
    COM2-02-57 | 6516 4359
    https://www.comp.nus.edu.sg/~damithch | @damithc


    Michael D. Adams

    Co-Lecturer
    adamsmd[at]nus.edu.sg
    COM3‐02‐47
    @adamsmd


    Prabhu NATARAJAN

    Co-Lecturer
    prabhu[at]comp.nus.edu.sg
    COM3-02-34 | 6516 1105
    @prabhu-na


    Kim hyeongcheol (Danny)

    Head TA
    dcskh[at]nus.edu.sg
    8750 5674
    @bluesky0911


    Anis Bin Yusof

    Graduate Tutor
    anis[at]comp.nus.edu.sg
    6516 8557
    @anisyusof-sc

    Tutors

    1. Aditya

    BAJAJ ADITYA
    e1070584[at]u.nus.edu
    @AdityaB4


    2. Ashley

    ASHLEY CHANG LE XUAN
    e0958221[at]u.nus.edu
    @ashleyclx


    3. Billy

    BILLY HO CHENG EN
    e0958176[at]u.nus.edu
    @billyhoce


    4. Chan How

    CHONG CHAN HOW
    e0969803[at]u.nus.edu
    @ChillinRage


    5. Dillon

    TAN KAH HO DILLON
    e0958762[at]u.nus.edu
    @dillontkh


    6. Dinghao

    SIM DING HAO
    e0958218[at]u.nus.edu
    @DingBao-sys


    7. Elton

    Chua Meng Yong Elton
    e0725906[at]u.nus.edu
    @notle1706


    8. Fikri

    MUHAMMAD FIKRI BIN ABDUL KALAM
    e0970206[at]u.nus.edu
    @mfjkri


    9. Gallen

    GALLEN ONG KAI BIN
    e0958202[at]u.nus.edu
    @gongg21


    10. Ha Thu

    TRAN HA THU
    e0969496[at]u.nus.edu
    @oeggy03


    11. Hui Xuan

    TAN HUI XUAN
    e0775523[at]u.nus.edu
    @huixuant


    12. Isaac

    ONG KOK YEE ISAAC
    e0373113[at]u.nus.edu
    @cocoanautz


    13. Jin Yuan

    NG JIN YUAN
    e0775530[at]u.nus.edu
    @jnjy


    14. Jiu Fong

    LAM JIU FONG
    e0960521[at]u.nus.edu
    @LamJiuFong


    15. Joel

    JOEL GOH MIN FENG
    e0957940[at]u.nus.edu
    @joelgoh1


    16. Jun Yi

    GOH JUN YI
    e0726438[at]u.nus.edu
    @Junyi00


    17. Junwu

    WANG JUNWU
    e1032464[at]u.nus.edu
    @narwhalsilent


    18. Khang Hou

    TAN KHANG HOU
    e1067145[at]u.nus.edu
    @tankh99


    19. Kyal

    KYAL SIN MIN THET
    e0969846[at]u.nus.edu
    @marcus-ny


    20. Lynnette

    ONG XIN HUI LYNNETTE
    e0968030[at]u.nus.edu
    @lynnetteeee


    21. Marcus

    SOH ZHENG YANG, MARCUS
    e0957429[at]u.nus.edu
    @HollaG


    22. Melissa

    Melissa Anastasia Harijanto
    e0851434[at]u.nus.edu
    @melissaharijanto


    23. Merrick

    MERRICK NEO KAI JIE
    e0726513[at]u.nus.edu
    @Merrickneo


    24. Reyaaz

    MUHAMMAD REYAAZ BIN ABDUL BASHEER
    e0544058[at]u.nus.edu
    @ARPspoofing


    25. Richie

    RICHIE HSIEH
    e0957714[at]u.nus.edu
    @richiehx


    26. Rithik

    RAMU RITHIK VIJAY
    e0969886[at]u.nus.edu
    @papataco14


    27. Shuyao

    XU SHUYAO
    e1088140[at]u.nus.edu
    @Tim-Siu


    28. Si Kai

    Chang Si Kai
    e0725915[at]u.nus.edu
    @sikai00


    29. Tania

    TANIA TAN SHU QI
    e0969220[at]u.nus.edu
    @taniatsq


    30. Timothy

    TIMOTHY PUTRA PRASETIO
    e0960320[at]u.nus.edu
    @tim-pipi


    31. Wayne

    Wayne Zhang Si Yuan
    e0726154[at]u.nus.edu
    @waynezsy


    32. Wei Zhe

    TAN WEI ZHE
    e0725610[at]u.nus.edu
    @wz2k


    33. Xiao Yun

    WU XIAOYUN
    e0702008[at]u.nus.edu
    @wxiaoyun


    34. Yan Jie

    NG YAN JIE
    e0969516[at]u.nus.edu
    @logical-1985516


    35. Yi Teng

    Tee Yi Teng
    e0725799[at]u.nus.edu
    @Puakii


    36. Yong Jing

    GOH YONG JING
    e0693145[at]u.nus.edu
    @gohyongjing


    37. Yu Cong

    KOO YU CONG
    e0960480[at]u.nus.edu
    @yucongkoo


    38. Yue Ran

    KANG YUE RAN
    e0695185[at]u.nus.edu
    @kyueran


    39. Yuheng

    GUO YUHENG
    e0958572[at]u.nus.edu
    @DistractedCat


    40. Zong Xun

    LEE ZONG XUN
    e0725594[at]u.nus.edu
    @Zxun2


    Dev Team

    This course is supported by a number of software tools developed by our students:


    TutorialsTextbooks

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    TutorialsTextbooks


    Instructors : OPTIONAL

    Staff

    Damith Chatura RAJAPAKSE

    Course Coordinator
    damith[at]comp.nus.edu.sg
    COM2-02-57 | 6516 4359
    https://www.comp.nus.edu.sg/~damithch | @damithc


    Michael D. Adams

    Co-Lecturer
    adamsmd[at]nus.edu.sg
    COM3‐02‐47
    @adamsmd


    Prabhu NATARAJAN

    Co-Lecturer
    prabhu[at]comp.nus.edu.sg
    COM3-02-34 | 6516 1105
    @prabhu-na


    Kim hyeongcheol (Danny)

    Head TA
    dcskh[at]nus.edu.sg
    8750 5674
    @bluesky0911


    Anis Bin Yusof

    Graduate Tutor
    anis[at]comp.nus.edu.sg
    6516 8557
    @anisyusof-sc

    Tutors

    1. Aditya

    BAJAJ ADITYA
    e1070584[at]u.nus.edu
    @AdityaB4


    2. Ashley

    ASHLEY CHANG LE XUAN
    e0958221[at]u.nus.edu
    @ashleyclx


    3. Billy

    BILLY HO CHENG EN
    e0958176[at]u.nus.edu
    @billyhoce


    4. Chan How

    CHONG CHAN HOW
    e0969803[at]u.nus.edu
    @ChillinRage


    5. Dillon

    TAN KAH HO DILLON
    e0958762[at]u.nus.edu
    @dillontkh


    6. Dinghao

    SIM DING HAO
    e0958218[at]u.nus.edu
    @DingBao-sys


    7. Elton

    Chua Meng Yong Elton
    e0725906[at]u.nus.edu
    @notle1706


    8. Fikri

    MUHAMMAD FIKRI BIN ABDUL KALAM
    e0970206[at]u.nus.edu
    @mfjkri


    9. Gallen

    GALLEN ONG KAI BIN
    e0958202[at]u.nus.edu
    @gongg21


    10. Ha Thu

    TRAN HA THU
    e0969496[at]u.nus.edu
    @oeggy03


    11. Hui Xuan

    TAN HUI XUAN
    e0775523[at]u.nus.edu
    @huixuant


    12. Isaac

    ONG KOK YEE ISAAC
    e0373113[at]u.nus.edu
    @cocoanautz


    13. Jin Yuan

    NG JIN YUAN
    e0775530[at]u.nus.edu
    @jnjy


    14. Jiu Fong

    LAM JIU FONG
    e0960521[at]u.nus.edu
    @LamJiuFong


    15. Joel

    JOEL GOH MIN FENG
    e0957940[at]u.nus.edu
    @joelgoh1


    16. Jun Yi

    GOH JUN YI
    e0726438[at]u.nus.edu
    @Junyi00


    17. Junwu

    WANG JUNWU
    e1032464[at]u.nus.edu
    @narwhalsilent


    18. Khang Hou

    TAN KHANG HOU
    e1067145[at]u.nus.edu
    @tankh99


    19. Kyal

    KYAL SIN MIN THET
    e0969846[at]u.nus.edu
    @marcus-ny


    20. Lynnette

    ONG XIN HUI LYNNETTE
    e0968030[at]u.nus.edu
    @lynnetteeee


    21. Marcus

    SOH ZHENG YANG, MARCUS
    e0957429[at]u.nus.edu
    @HollaG


    22. Melissa

    Melissa Anastasia Harijanto
    e0851434[at]u.nus.edu
    @melissaharijanto


    23. Merrick

    MERRICK NEO KAI JIE
    e0726513[at]u.nus.edu
    @Merrickneo


    24. Reyaaz

    MUHAMMAD REYAAZ BIN ABDUL BASHEER
    e0544058[at]u.nus.edu
    @ARPspoofing


    25. Richie

    RICHIE HSIEH
    e0957714[at]u.nus.edu
    @richiehx


    26. Rithik

    RAMU RITHIK VIJAY
    e0969886[at]u.nus.edu
    @papataco14


    27. Shuyao

    XU SHUYAO
    e1088140[at]u.nus.edu
    @Tim-Siu


    28. Si Kai

    Chang Si Kai
    e0725915[at]u.nus.edu
    @sikai00


    29. Tania

    TANIA TAN SHU QI
    e0969220[at]u.nus.edu
    @taniatsq


    30. Timothy

    TIMOTHY PUTRA PRASETIO
    e0960320[at]u.nus.edu
    @tim-pipi


    31. Wayne

    Wayne Zhang Si Yuan
    e0726154[at]u.nus.edu
    @waynezsy


    32. Wei Zhe

    TAN WEI ZHE
    e0725610[at]u.nus.edu
    @wz2k


    33. Xiao Yun

    WU XIAOYUN
    e0702008[at]u.nus.edu
    @wxiaoyun


    34. Yan Jie

    NG YAN JIE
    e0969516[at]u.nus.edu
    @logical-1985516


    35. Yi Teng

    Tee Yi Teng
    e0725799[at]u.nus.edu
    @Puakii


    36. Yong Jing

    GOH YONG JING
    e0693145[at]u.nus.edu
    @gohyongjing


    37. Yu Cong

    KOO YU CONG
    e0960480[at]u.nus.edu
    @yucongkoo


    38. Yue Ran

    KANG YUE RAN
    e0695185[at]u.nus.edu
    @kyueran


    39. Yuheng

    GUO YUHENG
    e0958572[at]u.nus.edu
    @DistractedCat


    40. Zong Xun

    LEE ZONG XUN
    e0725594[at]u.nus.edu
    @Zxun2


    Dev Team

    This course is supported by a number of software tools developed by our students:


    TutorialsTextbooks

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/instructors.page-vue-render.js b/admin/instructors.page-vue-render.js index e1e8930a6f..b008d3dac9 100644 --- a/admin/instructors.page-vue-render.js +++ b/admin/instructors.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Tutorials")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/textbooks.html"}},[_c('span',[_v("Textbooks "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('br'),_v(" "),_c('h1',{attrs:{"id":"instructors-optional"}},[_c('span',{staticClass:"display-4"},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"text-muted text-light",staticStyle:{"font-size":"15px"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v(": OPTIONAL")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#instructors-optional","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('h2',{attrs:{"id":"staff"}},[_v("Staff"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#staff","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Damith"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"/website/admin/images/damith.png","width":"150"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"damith-chatura-rajapakse"}},[_c('strong',[_v("Damith")]),_v(" Chatura RAJAPAKSE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#damith-chatura-rajapakse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Course Coordinator")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("damith")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("comp.nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" COM2-02-57 | "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 6516 4359"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~damithch"}},[_v("https://www.comp.nus.edu.sg/~damithch")]),_v(" | "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/damithc"}},[_v("@damithc")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Michael"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/adamsmd.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"michael-d-adams"}},[_c('strong',[_v("Michael")]),_v(" D. Adams"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#michael-d-adams","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Co-Lecturer")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("adamsmd")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" COM3‐02‐47"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/adamsmd"}},[_v("@adamsmd")])])])])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Prabhu"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/prabhu-na.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"prabhu-natarajan"}},[_c('strong',[_v("Prabhu")]),_v(" NATARAJAN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#prabhu-natarajan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Co-Lecturer")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("prabhu")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("comp.nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" COM3-02-34 | "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 6516 1105"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/prabhu-na"}},[_v("@prabhu-na")])])])])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Danny"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/bluesky0911.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"kim-hyeongcheol-danny"}},[_v("Kim hyeongcheol ("),_c('strong',[_v("Danny")]),_v(")"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#kim-hyeongcheol-danny","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Head TA")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dcskh")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 8750 5674"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/bluesky0911"}},[_v("@bluesky0911")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Anis"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/anisyusof-sc.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"anis-bin-yusof"}},[_c('strong',[_v("Anis")]),_v(" Bin Yusof"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#anis-bin-yusof","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Graduate Tutor")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("anis")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("comp.nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 6516 8557"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/anisyusof-sc"}},[_v("@anisyusof-sc")])])]),_c('p')])]),_v(" "),_c('h2',{attrs:{"id":"tutors"}},[_v("Tutors"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tutors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Aditya"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/adityab4.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"1-aditya"}},[_v("1. Aditya"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-aditya","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("BAJAJ ADITYA")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1070584[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AdityaB4"}},[_v("@AdityaB4")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Ashley"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/ashleyclx.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"2-ashley"}},[_v("2. Ashley"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-ashley","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("ASHLEY CHANG LE XUAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958221[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/ashleyclx"}},[_v("@ashleyclx")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Billy"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/billyhoce.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"3-billy"}},[_v("3. Billy"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-billy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("BILLY HO CHENG EN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958176[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/billyhoce"}},[_v("@billyhoce")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Chan-How"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/chillinrage.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"4-chan-how"}},[_v("4. Chan How"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-chan-how","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("CHONG CHAN HOW")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969803[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/ChillinRage"}},[_v("@ChillinRage")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Dillon"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/dillontkh.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"5-dillon"}},[_v("5. Dillon"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-dillon","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN KAH HO DILLON")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958762[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/dillontkh"}},[_v("@dillontkh")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Dinghao"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/dingbao-sys.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"6-dinghao"}},[_v("6. Dinghao"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#6-dinghao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("SIM DING HAO")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958218[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/DingBao-sys"}},[_v("@DingBao-sys")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Elton"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/notle1706.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"7-elton"}},[_v("7. Elton"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#7-elton","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Chua Meng Yong Elton")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725906[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/notle1706"}},[_v("@notle1706")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Fikri"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/mfjkri.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"8-fikri"}},[_v("8. Fikri"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#8-fikri","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("MUHAMMAD FIKRI BIN ABDUL KALAM")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0970206[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/mfjkri"}},[_v("@mfjkri")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Gallen"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/gongg21.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"9-gallen"}},[_v("9. Gallen"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#9-gallen","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GALLEN ONG KAI BIN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958202[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/gongg21"}},[_v("@gongg21")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Ha-Thu"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/oeggy03.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"10-ha-thu"}},[_v("10. Ha Thu"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#10-ha-thu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TRAN HA THU")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969496[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/oeggy03"}},[_v("@oeggy03")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Hui-Xuan"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/huixuant.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"11-hui-xuan"}},[_v("11. Hui Xuan"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#11-hui-xuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN HUI XUAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0775523[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/huixuant"}},[_v("@huixuant")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Isaac"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/cocoanautz.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"12-isaac"}},[_v("12. Isaac"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#12-isaac","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("ONG KOK YEE ISAAC")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0373113[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/cocoanautz"}},[_v("@cocoanautz")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Jin-Yuan"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/jnjy.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"13-jin-yuan"}},[_v("13. Jin Yuan"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#13-jin-yuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("NG JIN YUAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0775530[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/jnjy"}},[_v("@jnjy")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Jiu-Fong"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/lamjiufong.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"14-jiu-fong"}},[_v("14. Jiu Fong"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#14-jiu-fong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("LAM JIU FONG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0960521[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/LamJiuFong"}},[_v("@LamJiuFong")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Joel"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/joelgoh1.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"15-joel"}},[_v("15. Joel"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#15-joel","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("JOEL GOH MIN FENG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0957940[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/joelgoh1"}},[_v("@joelgoh1")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Jun-Yi"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/junyi00.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"16-jun-yi"}},[_v("16. Jun Yi"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#16-jun-yi","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GOH JUN YI")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0726438[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Junyi00"}},[_v("@Junyi00")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Junwu"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/narwhalsilent.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"17-junwu"}},[_v("17. Junwu"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#17-junwu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("WANG JUNWU")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1032464[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/narwhalsilent"}},[_v("@narwhalsilent")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Khang-Hou"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/tankh99.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"18-khang-hou"}},[_v("18. Khang Hou"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#18-khang-hou","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN KHANG HOU")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1067145[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/tankh99"}},[_v("@tankh99")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Kyal"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/marcus-ny.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"19-kyal"}},[_v("19. Kyal"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#19-kyal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("KYAL SIN MIN THET")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969846[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/marcus-ny"}},[_v("@marcus-ny")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Lynnette"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/lynnetteeee.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"20-lynnette"}},[_v("20. Lynnette"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#20-lynnette","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("ONG XIN HUI LYNNETTE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0968030[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/lynnetteeee"}},[_v("@lynnetteeee")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Marcus"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/hollag.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"21-marcus"}},[_v("21. Marcus"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#21-marcus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("SOH ZHENG YANG, MARCUS")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0957429[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/HollaG"}},[_v("@HollaG")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Melissa"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/melissaharijanto.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"22-melissa"}},[_v("22. Melissa"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#22-melissa","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Melissa Anastasia Harijanto")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0851434[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/melissaharijanto"}},[_v("@melissaharijanto")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Merrick"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/merrickneo.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"23-merrick"}},[_v("23. Merrick"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#23-merrick","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("MERRICK NEO KAI JIE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0726513[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Merrickneo"}},[_v("@Merrickneo")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Reyaaz"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/arpspoofing.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"24-reyaaz"}},[_v("24. Reyaaz"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#24-reyaaz","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("MUHAMMAD REYAAZ BIN ABDUL BASHEER")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0544058[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/ARPspoofing"}},[_v("@ARPspoofing")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Richie"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/richiehx.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"25-richie"}},[_v("25. Richie"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#25-richie","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("RICHIE HSIEH")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0957714[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/richiehx"}},[_v("@richiehx")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Rithik"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/papataco14.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"26-rithik"}},[_v("26. Rithik"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#26-rithik","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("RAMU RITHIK VIJAY")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969886[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/papataco14"}},[_v("@papataco14")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Shuyao"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/tim-siu.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"27-shuyao"}},[_v("27. Shuyao"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#27-shuyao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("XU SHUYAO")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1088140[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Tim-Siu"}},[_v("@Tim-Siu")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Si-Kai"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/sikai00.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"28-si-kai"}},[_v("28. Si Kai"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#28-si-kai","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Chang Si Kai")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725915[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/sikai00"}},[_v("@sikai00")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Tania"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/taniatsq.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"29-tania"}},[_v("29. Tania"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#29-tania","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TANIA TAN SHU QI")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969220[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/taniatsq"}},[_v("@taniatsq")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Timothy"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/tim-pipi.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"30-timothy"}},[_v("30. Timothy"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#30-timothy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TIMOTHY PUTRA PRASETIO")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0960320[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/tim-pipi"}},[_v("@tim-pipi")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Wayne"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/waynezsy.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"31-wayne"}},[_v("31. Wayne"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#31-wayne","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Wayne Zhang Si Yuan")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0726154[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/waynezsy"}},[_v("@waynezsy")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Wei-Zhe"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/wz2k.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"32-wei-zhe"}},[_v("32. Wei Zhe"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#32-wei-zhe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN WEI ZHE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725610[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/wz2k"}},[_v("@wz2k")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Xiao-Yun"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/wxiaoyun.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"33-xiao-yun"}},[_v("33. Xiao Yun"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#33-xiao-yun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("WU XIAOYUN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0702008[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/wxiaoyun"}},[_v("@wxiaoyun")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yan-Jie"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/logical-1985516.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"34-yan-jie"}},[_v("34. Yan Jie"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#34-yan-jie","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("NG YAN JIE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969516[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/logical-1985516"}},[_v("@logical-1985516")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yi-Teng"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/puakii.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"35-yi-teng"}},[_v("35. Yi Teng"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#35-yi-teng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Tee Yi Teng")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725799[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Puakii"}},[_v("@Puakii")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yong-Jing"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/gohyongjing.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"36-yong-jing"}},[_v("36. Yong Jing"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#36-yong-jing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GOH YONG JING")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0693145[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/gohyongjing"}},[_v("@gohyongjing")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yu-Cong"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/yucongkoo.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"37-yu-cong"}},[_v("37. Yu Cong"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#37-yu-cong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("KOO YU CONG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0960480[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/yucongkoo"}},[_v("@yucongkoo")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yue-Ran"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/kyueran.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"38-yue-ran"}},[_v("38. Yue Ran"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#38-yue-ran","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("KANG YUE RAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0695185[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/kyueran"}},[_v("@kyueran")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yuheng"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/distractedcat.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"39-yuheng"}},[_v("39. Yuheng"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#39-yuheng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GUO YUHENG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958572[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/DistractedCat"}},[_v("@DistractedCat")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Zong-Xun"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/zxun2.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"40-zong-xun"}},[_v("40. Zong Xun"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#40-zong-xun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("LEE ZONG XUN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725594[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Zxun2"}},[_v("@Zxun2")])])]),_c('p')])]),_v(" "),_c('hr')]),_v(" "),_c('h2',{attrs:{"id":"dev-team"}},[_v("Dev Team"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dev-team","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This course is supported by a number of software tools developed by our students:")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher#current-dev-team"}},[_c('strong',[_v("CATcher")]),_v(" dev team")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://markbind.org/about.html"}},[_c('strong',[_v("MarkBind")]),_v(" dev team")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~pptlabs/contact.html"}},[_c('strong',[_v("PowerPointLabs")]),_v(" dev team")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://reposense.org/about.html"}},[_c('strong',[_v("RepoSense")]),_v(" dev team")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/docs/team.html"}},[_c('strong',[_v("SE-EDU")]),_v(" dev team")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/about"}},[_c('strong',[_v("TEAMMATES")]),_v(" dev team")])])])]),_v(" "),_c('br'),_v(" "),_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Tutorials")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/textbooks.html"}},[_c('span',[_v("Textbooks "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-grading.html b/admin/ip-grading.html index 960323e061..e99728948c 100644 --- a/admin/ip-grading.html +++ b/admin/ip-grading.html @@ -23,7 +23,7 @@

    iP: Week 8tP (team project): Overview


    iP: Grading

    iP serves mostly a formative role in this course i.e., it aims to ensure everyone has achieved a basic competency level that is a prerequisite to survive the tP (it does not aim to rank you based on strength or differentiate strong programmers from the rest). Hence, it is graded somewhat like an S/U component and almost everyone is expected to receive full marks for the iP.

    Full marks for the iP is 15.

    • Meeting all the bars specified below you earn your iP full 15 marks.
    • Falling below any of the bars specified below will limit your iP score to less than half the marks.

    That is, you either get full marks, or less than half the marks.

    Implementation [10 marks]
    • More than 90% of all deliverables completed.
      Requirements marked as optional or if-applicable are not counted when calculating the percentage of deliverables.
      -When a requirement specifies a minimal version of it, simply reaching that minimal version of the requirement is enough for it to be counted for grading -- however, we recommend you to go beyond the minimal; the farther you go, the more practice you will get.
    • Has a GUI that is at least as good as the one reached by the JavaFx tutorial part 4 (i.e., no need to have features covered in part 5).
    • No major bugs.
    • Reasonable use of OOP e.g., at least some use of inheritance, code divided into classes in a sensible way (e.g., Ui, Storage, Parser, Storage, Todo, Deadline, Event etc.).
    • At least half of public methods/classes have javadoc comments.
    • Reasonable code quality:
      • No blatant violations of the coding standard (both Java and Git conventions).
      • The code is neat e.g., no chunks of commented out code.
      • Reasonable use of SLAP e.g., no very-long methods or deeply nested code.
    • At least some errors are handled using exceptions.
    • At least two methods unit tested well using JUnit.
    Project Management [2 marks]
    • Submitted some deliverables in at least 4 out of the 5 iP weeks (i.e., week 2 - week 6)
    • Followed other requirements specified (e.g., how to use Git/GitHub for each increment, do peer reviews) in at least 4 weeks
      To qualify for full marks, your last 5 iP commits need to comply with our convention for Git commit message subject. If you forgot to do this, add more commits with some small tweaks to the code until you satisfy this requirement, in order to satisfy this requirement (Reason: doing so will help you remember this convention better in the tP, hopefully).
    Documentation [3 marks]

    The product Website and the user guide:

    • Provides enough guidance to the user. Covers all non-trivial features.
    • No major formatting errors in the published view.

    You can monitor your iP progress (as detected by our scripts) in the iP Progress Dashboard page.


    iP: Week 8tP (team project): Overview

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +When a requirement specifies a minimal version of it, simply reaching that minimal version of the requirement is enough for it to be counted for grading -- however, we recommend you to go beyond the minimal; the farther you go, the more practice you will get.
  • Has a GUI that is at least as good as the one reached by the JavaFx tutorial part 4 (i.e., no need to have features covered in part 5).
  • No major bugs.
  • Reasonable use of OOP e.g., at least some use of inheritance, code divided into classes in a sensible way (e.g., Ui, Storage, Parser, Storage, Todo, Deadline, Event etc.).
  • At least half of public methods/classes have javadoc comments.
  • Reasonable code quality:
    • No blatant violations of the coding standard (both Java and Git conventions).
    • The code is neat e.g., no chunks of commented out code.
    • Reasonable use of SLAP e.g., no very-long methods or deeply nested code.
  • At least some errors are handled using exceptions.
  • At least two methods unit tested well using JUnit.
  • Project Management [2 marks]
    • Submitted some deliverables in at least 4 out of the 5 iP weeks (i.e., week 2 - week 6)
    • Followed other requirements specified (e.g., how to use Git/GitHub for each increment, do peer reviews) in at least 4 weeks
      To qualify for full marks, your last 5 iP commits need to comply with our convention for Git commit message subject. If you forgot to do this, add more commits with some small tweaks to the code until you satisfy this requirement, in order to satisfy this requirement (Reason: doing so will help you remember this convention better in the tP, hopefully).
    Documentation [3 marks]

    The product Website and the user guide:

    • Provides enough guidance to the user. Covers all non-trivial features.
    • No major formatting errors in the published view.

    You can monitor your iP progress (as detected by our scripts) in the iP Progress Dashboard page.


    iP: Week 8tP (team project): Overview

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-grading.page-vue-render.js b/admin/ip-grading.page-vue-render.js index 6d2b60492b..30fb47290d 100644 --- a/admin/ip-grading.page-vue-render.js +++ b/admin/ip-grading.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Meeting all the bars specif with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w8.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 8")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_v("tP (team project): Overview "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-overview.html b/admin/ip-overview.html index 28e6df46e5..e03cf6551c 100644 --- a/admin/ip-overview.html +++ b/admin/ip-overview.html @@ -21,7 +21,7 @@
  • Standards/ConventionsiP: Week 2


    iP (Individual Project): Overview

    The objectives of the individual project (iP) is to learn/refresh the basics of,

    • Java
    • OOP
    • IDEs
    • Git and GitHub
    • Project automation tools
    • Code quality

    All skills you will learn in the iP will be useful in the team project (tP). Some of the iP code can even be adapted for the tP.
    The more you do in the iP and farther you push beyond the minimal expectations, the easier it will be in your tP.

    The iP is based on the generic project called Project Duke, the overview of which is given below.

    Duke Overview


    The iP is to be done over the first half of the semester.


    Standards/ConventionsiP: Week 2

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Standards/ConventionsiP: Week 2


    iP (Individual Project): Overview

    The objectives of the individual project (iP) is to learn/refresh the basics of,

    • Java
    • OOP
    • IDEs
    • Git and GitHub
    • Project automation tools
    • Code quality

    All skills you will learn in the iP will be useful in the team project (tP). Some of the iP code can even be adapted for the tP.
    The more you do in the iP and farther you push beyond the minimal expectations, the easier it will be in your tP.

    The iP is based on the generic project called Project Duke, the overview of which is given below.

    Duke Overview


    The iP is to be done over the first half of the semester.


    Standards/ConventionsiP: Week 2

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-overview.page-vue-render.js b/admin/ip-overview.page-vue-render.js index 732b3e0bc5..934684f502 100644 --- a/admin/ip-overview.page-vue-render.js +++ b/admin/ip-overview.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("The iP is to be done over the first h with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Standards/Conventions")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w2.html"}},[_c('span',[_v("iP: Week 2 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-showcase.html b/admin/ip-showcase.html index ee398a802c..c00dfda8a6 100644 --- a/admin/ip-showcase.html +++ b/admin/ip-showcase.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/admin/ip-showcase.page-vue-render.js b/admin/ip-showcase.page-vue-render.js index 111ed5b2fe..92effdaa7e 100644 --- a/admin/ip-showcase.page-vue-render.js +++ b/admin/ip-showcase.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('h1',{attrs:{"id":"ip-showcase"}},[_v("iP Showcase"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ip-showcase","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w2.html b/admin/ip-w2.html index afbf338192..a1defdda3a 100644 --- a/admin/ip-w2.html +++ b/admin/ip-w2.html @@ -34,7 +34,7 @@ commit id: "Add support for list" commit id: "Add support for bye"
  • git push the code to your fork
    Git doesn't push tags unless you specifically ask it to. -After pushing a tag to your fork, you should be able to see that tag by visiting https://github.com/YOUR_USER_NAME/REPO_NAME/tags e.g., https://github.com/se-edu/addressbook-level3/tags
    If you encounter issues connecting Sourcetree with your GitHub account, refer to this Sourcetree Tutorial.
  • The relevant textbook topics are:
    • Remember to take note of our plagiarism policies, if you haven't done so already:

    iP feels like 'same same' ...?

    As you do the iP, if you feel like you are not learning enough new stuff as you've done similar work before (at least on the Java/OOP side), there is an alternative approach you can take to the iP. See the panel below if you are interested.

    Duke Level-0: Rename, Greet, Exit

    Duke Level-1: Echo

    Duke Level-2: Add, List

    Duke Level-3: Mark as Done

    Duke Level-4: ToDo, Event, Deadline

    Duke A-TextUiTesting: Automated Text UI Testing

    Duke Level-5: Handle Errors

    Duke Level-6: Delete

    Duke A-Enums: Use Enums if-applicable

    FAQ about iP increments

    FAQ How are the iP git tags used in grading?


    FAQ What if I discovered a bug after I finished an increment?


    FAQ I did multiple increments in the same commit. How to fix?


    FAQ The requirements of an increment scheduled for this week is already satisfied by the work I did in an earlier week. What now?


    FAQ My iP increments are not detected by the dashboard because I forgot to push my tags earlier. What now?


    FAQ Oh no! I made a mistake in my tag/branch name.



    iP (Individual Project): OverviewiP: Week 3

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +After pushing a tag to your fork, you should be able to see that tag by visiting https://github.com/YOUR_USER_NAME/REPO_NAME/tags e.g., https://github.com/se-edu/addressbook-level3/tags
    If you encounter issues connecting Sourcetree with your GitHub account, refer to this Sourcetree Tutorial.
  • The relevant textbook topics are:
    • Remember to take note of our plagiarism policies, if you haven't done so already:

    iP feels like 'same same' ...?

    As you do the iP, if you feel like you are not learning enough new stuff as you've done similar work before (at least on the Java/OOP side), there is an alternative approach you can take to the iP. See the panel below if you are interested.

    Duke Level-0: Rename, Greet, Exit

    Duke Level-1: Echo

    Duke Level-2: Add, List

    Duke Level-3: Mark as Done

    Duke Level-4: ToDo, Event, Deadline

    Duke A-TextUiTesting: Automated Text UI Testing

    Duke Level-5: Handle Errors

    Duke Level-6: Delete

    Duke A-Enums: Use Enums if-applicable

    FAQ about iP increments

    FAQ How are the iP git tags used in grading?


    FAQ What if I discovered a bug after I finished an increment?


    FAQ I did multiple increments in the same commit. How to fix?


    FAQ The requirements of an increment scheduled for this week is already satisfied by the work I did in an earlier week. What now?


    FAQ My iP increments are not detected by the dashboard because I forgot to push my tags earlier. What now?


    FAQ Oh no! I made a mistake in my tag/branch name.



    iP (Individual Project): OverviewiP: Week 3

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w2.page-vue-render.js b/admin/ip-w2.page-vue-render.js index d4b832109d..ecaa7fd12f 100644 --- a/admin/ip-w2.page-vue-render.js +++ b/admin/ip-w2.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP (Individual Project): Overview")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w3.html"}},[_c('span',[_v("iP: Week 3 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w3.html b/admin/ip-w3.html index 36454de628..9644832e0a 100644 --- a/admin/ip-w3.html +++ b/admin/ip-w3.html @@ -196,7 +196,7 @@ merge branch-A-CodingStandard tag: "A-CodingStandard" merge branch-Level-9 tag: "Level-9" commit id: "m6" -
    • The Java and Git standards to follow (for A-CodingStandard) are given in this page.
    • After finishing, assuming you encountered merge conflicts (and some were rather painful to resolve), think of how such conflicts could have been reduced (e.g., by changing the order of merging, or minimizing parallel branches when certain type of changes are being done to the code).
    Duke A-JavaDoc: JavaDoc

    Duke A-CodingStandard: Follow the Coding Standard

    Duke Level-9: Find

    6 [Optional] Get a head start on JavaFX

    If you can spare some time, start learning JavaFX by following the JavaFX tutorial @SE-EDU/guides. Doing so will make your life easier in the following week.


    iP: Week 2iP: Week 4

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • The Java and Git standards to follow (for A-CodingStandard) are given in this page.
    • After finishing, assuming you encountered merge conflicts (and some were rather painful to resolve), think of how such conflicts could have been reduced (e.g., by changing the order of merging, or minimizing parallel branches when certain type of changes are being done to the code).
    Duke A-JavaDoc: JavaDoc

    Duke A-CodingStandard: Follow the Coding Standard

    Duke Level-9: Find

    6 [Optional] Get a head start on JavaFX

    If you can spare some time, start learning JavaFX by following the JavaFX tutorial @SE-EDU/guides. Doing so will make your life easier in the following week.


    iP: Week 2iP: Week 4

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w3.page-vue-render.js b/admin/ip-w3.page-vue-render.js index 7e96e2b8b3..3d309976cb 100644 --- a/admin/ip-w3.page-vue-render.js +++ b/admin/ip-w3.page-vue-render.js @@ -86,6 +86,6 @@ with(this){return _c('div',[_c('p',[_v("If you can spare some time, start learni with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w2.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 2")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w4.html"}},[_c('span',[_v("iP: Week 4 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w4.html b/admin/ip-w4.html index ffd2ad2b95..3e3957b13d 100644 --- a/admin/ip-w4.html +++ b/admin/ip-w4.html @@ -66,7 +66,7 @@ Review comments don't always have to be about problems in the code. Other things you can do:
    • compliment the author on not making a common mistake
    • ask questions
    • suggest alternatives
  • The review allocation is given in the panel below.
  • If the student you have been allocated to review has not created a PR (or the PR has a trivial amount of code), you can review the Backup PR to review provided in the allocation table. Failing both, review another PR allocated to another student in your own tutorial but not in your team.

    Tip for future reference: GitHub allows you to filter PRs/Issues using various criteria such as author:AuthorUsername (example -- see the filters text box in the target page).

    Alternatively, you can use PR labels (if any) to filter PRs/Issues.

    FAQ: How many comments should I add? Answer: Depends on the code being reviewed but we expect most PRs would warrant at least 4-5 comments. If the PR is huge, you can stop when you think you've put in a fair amount of time on the job (~15 minutes) and added enough comments for the PR author to receive some value.

    • Step 3 Do the second PR review as follows.
      • Comment on other code quality guidelines (see the section Code Quality: Naming) you have learned so far. It's optional to comment on coding standard violations in this PR review.
      • The review allocation is given in the panel below.

    If the allocated PR is not suitable, use the same strategy as before to find an alternative PR to review.

    • Step 4 [When you receive reviews for your own PR] Respond to comments received. You are recommended to (but not obliged to) respond to comments received from peers, especially if the PR reviewer asked you for more info. As mentioned in these guidelines, do not get into arguments with PR reviewers/authors.

    3 Learn from others (optional)

    • You can use the iP Code Dashboard to view others' iP code, using the Links → iP Code Dashboard item in the top navigation menu of this course website.We encourage you to read others’ code and learn from them. If you adopt solutions from others (also encouraged), please follow our reuse policy. 

    Click on the  icon corresponding to a student name to see the code written by that person.

    You can enable the [ ] show tags option at the top of the dashboard to see tags in each repo. Similarly, you can click on the  icon to see a list of commits in a specific repo.

    4 Add Increments as branches: A-CheckStyle, Level-10, A-Varargs

    Duke A-CheckStyle: Use CheckStyle optional


    Attention Mac users! If you are not using the exact Azul JDK distribution (not any other JDK 17 distributions) specified by our advisory for Mac users in this page, you are likely to run into problems while doing Level-10.

    Duke Level-10: GUI

    • You no longer need to keep the text-based UI after adding a GUI (although you are welcome to). Similarly, there is no need to keep the I/O redirection style automated testing added via A-TextUiTesting) anymore -- that technique is suited for text UIs only.
    • Is the bye command still needed, now that the GUI can be closed in other ways?
      -Yes, we recommend keeping it. Reason: Being able to close the app by typing a command is consistent with the app's CLI-style .
    Duke A-Varargs: Use Varargs if-applicable


    iP: Week 3iP: Week 5

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Yes, we recommend keeping it. Reason: Being able to close the app by typing a command is consistent with the app's CLI-style .
    Duke A-Varargs: Use Varargs if-applicable


    iP: Week 3iP: Week 5

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w4.page-vue-render.js b/admin/ip-w4.page-vue-render.js index 7ef126ae22..7686b14f3d 100644 --- a/admin/ip-w4.page-vue-render.js +++ b/admin/ip-w4.page-vue-render.js @@ -74,6 +74,6 @@ with(this){return _c('strong',[_v("Is the "),_c('code',{pre:true,attrs:{"class": with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w3.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 3")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w5.html"}},[_c('span',[_v("iP: Week 5 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w5.html b/admin/ip-w5.html index 6598f8fed9..3bc63033ec 100644 --- a/admin/ip-w5.html +++ b/admin/ip-w5.html @@ -150,7 +150,7 @@ checkout branch-A-Streams merge master

    FAQ Oops, I messed up my branching! Will I be penalized?


    Duke A-Assertions: Use Assertions

    Duke A-CodeQuality: Improve Code Quality

    Duke A-Streams: Use Streams optional

    4 Add Increment: A-CI

    • We recommend that at least one member of the team attempt the following.
    Duke A-CI: Set up CI optional

    5 Add an extension

    • Add at least one extension of your choice, selected from category B, C, or D i.e., pick just one item from one category (i.e., one extension in total, not one from each category) e.g., B-DoWithinPeriodTasks or C-Sort or D-Places
    • Recommended to add the extension via a branch (branch name is up to you). Optional to add it via a PR.
    • Add a tag named BCD-Extension to the corresponding commit.
      -Irrespective of the exact extension you did, the tag name should be BCD-Extension.

    Discuss with your team members to ensure that each member picks a different extension.

    You may want to pick an extension that is potentially relevant to your tP so that the code can be reused in the tP later, if possible.


    iP: Week 4iP: Week 6

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Irrespective of the exact extension you did, the tag name should be BCD-Extension.

    Discuss with your team members to ensure that each member picks a different extension.

    You may want to pick an extension that is potentially relevant to your tP so that the code can be reused in the tP later, if possible.


    iP: Week 4iP: Week 6

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w5.page-vue-render.js b/admin/ip-w5.page-vue-render.js index 3dc36eeaee..db7c057647 100644 --- a/admin/ip-w5.page-vue-render.js +++ b/admin/ip-w5.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w4.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 4")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w6.html"}},[_c('span',[_v("iP: Week 6 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w6.html b/admin/ip-w6.html index 78b3b9ff03..cb1ec2ea4c 100644 --- a/admin/ip-w6.html +++ b/admin/ip-w6.html @@ -28,7 +28,7 @@
    1. Open a terminal window, and navigate to the root of your project folder.
    2. Run the java -version command to confirm the terminal is using Java 17.
    3. Run the ./gradlew clean shadowJar command to create the JAR file.
  • Do the following smoke tests to ensure the jar file works (reason: a similar flow will be used when grading your iP).
    1. Copy the jar file to an empty folder and test it from there. This should surface issues with hard-coded file paths.
      When running the jar file for smoke testing, instead of double-clicking the jar file, do the following: open a terminal -> navigate to the jar location -> run the java -jar "JAR_FILE_NAME" command.
    2. Pass the jar file to team members and ask them to do a test drive. Assuming some of your team members' OS differ from yours, this should verify if the app is cross-platform.
      If you don't have ready access to a specific OS, post a link to your JAR in the forum and ask others to help with the smoke testing -- some of them will even appreciate the opportunity to help a classmate.
      Note that concepts you encounter while doing course project tasks (e.g., smoke testing) are in the scope of the final exam.
  • Create a new release on GitHub (e.g., v0.2) and upload the JAR file. -
    • Recommended to refrain from uploading multiple JAR files as this can cause extra work for the evaluators.
  • Duke A-Release: Release


    iP: Week 5iP: Week 7

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Recommended to refrain from uploading multiple JAR files as this can cause extra work for the evaluators.
    Duke A-Release: Release


    iP: Week 5iP: Week 7

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w6.page-vue-render.js b/admin/ip-w6.page-vue-render.js index 1efff704ed..1dd706e7ff 100644 --- a/admin/ip-w6.page-vue-render.js +++ b/admin/ip-w6.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('ol',{attrs:{"start":"2"}},[_c('li',[_c('strong',[_v("Creat with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w5.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 5")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w7.html"}},[_c('span',[_v("iP: Week 7 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w7.html b/admin/ip-w7.html index 2e1138ba52..2b438a91e2 100644 --- a/admin/ip-w7.html +++ b/admin/ip-w7.html @@ -21,7 +21,7 @@
  • iP: Week 6iP: Week 8


    iP: Week 7 : OPTIONAL

    1. [Optional] Get more out of the iP

    1 [Optional] Get more out of the iP

    If you wish to cite the iP in your resume, you can do more to make it look more impressive to a potential employer. These improvements are not considered for grading and can be done after the semester is over. Some ideas:

    • Improve the GUI: Make the UI look nicer, unique, and memorable. You can get inspiration from what others have done (but remember to give credit if you reuse any code from them).
    • Add a demo video or an animated gif to your user guide to show how the app works.
    • Improve code quality: iP is the right size to cite as an example of your code quality. You can use the RepoSense link (</>) in the iP showcase page to point to your iP code.
    • Add more features.

    On a somewhat related note, you can also create similar product websites for your other projects (projects from other courses, pet projects).


    iP: Week 6iP: Week 8

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    iP: Week 6iP: Week 8


    iP: Week 7 : OPTIONAL

    1. [Optional] Get more out of the iP

    1 [Optional] Get more out of the iP

    If you wish to cite the iP in your resume, you can do more to make it look more impressive to a potential employer. These improvements are not considered for grading and can be done after the semester is over. Some ideas:

    • Improve the GUI: Make the UI look nicer, unique, and memorable. You can get inspiration from what others have done (but remember to give credit if you reuse any code from them).
    • Add a demo video or an animated gif to your user guide to show how the app works.
    • Improve code quality: iP is the right size to cite as an example of your code quality. You can use the RepoSense link (</>) in the iP showcase page to point to your iP code.
    • Add more features.

    On a somewhat related note, you can also create similar product websites for your other projects (projects from other courses, pet projects).


    iP: Week 6iP: Week 8

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w7.page-vue-render.js b/admin/ip-w7.page-vue-render.js index 14db294a42..0d913938f9 100644 --- a/admin/ip-w7.page-vue-render.js +++ b/admin/ip-w7.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('div',{staticClass:"indented"},[_c('p',[_c('stron with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w6.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 6")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w8.html"}},[_c('span',[_v("iP: Week 8 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/ip-w8.html b/admin/ip-w8.html index 5079b822dd..f0985ddd40 100644 --- a/admin/ip-w8.html +++ b/admin/ip-w8.html @@ -23,7 +23,7 @@

    iP: Week 7iP: Grading


    iP: Week 8

    1. Evaluate two peer iPs Sat, Oct 12th 2359

    1 Evaluate two peer iPs Sat, Oct 12th 2359

    This activity is worth 2x2=4 participation points.

    1. Wait for the email notifying you which iPs are allocated for you to evaluate. When the email is sent out, it will also be announced via course announcements.
    2. Download the latest JAR file of the first iP by following the link provided.

    FAQ What if the student has not uploaded a JAR file, or the JAR file doesn't work at all?


    1. Locate the User Guide of the app by following the link provided in that email.
    2. Open the Canvas survey (the one named iP Peer Evaluation 1) that you will be using to submit your evaluation and take note of the things you need to evaluate.
    3. Run the jar file in the following manner:
      • Put the jar file in an empty folder
        Reason: prevent data files created by other jar files you tested earlier from interfering with the current jar file.
      • Open a terminal, and navigate to the folder you put the JAR file in (e.g., cd smoke-test/ip1)
        Reason: data files will be created relative to the folder the terminal is currently in.
      • Run the java -version command to confirm you are using Java 17.
        Mac user, confirm you are using the exact Java distribution we have prescribed here.
      • Run the jar file using the java -jar "{file_name}" command (rather than double-clicking) in the same terminal.
    4. Do a light testing of the app (not more than 10 minutes) to ensure the claimed features actually exist and there are no obvious bugs.
    5. Do a quick examination of the code (~ 5 minutes) by following the provided link.
    6. Submit your evaluation using the survey.
    7. Repeat the above steps for the 2nd iP allocated to you (use the survey iP Peer Evaluation 2).
      -If both iPs crash or fail severely in a similar fashion, the problem may be on your side. Please contact the teaching team to ask how to proceed.
    8. Take note of the effort required for a typical iP: After seeing two more iPs, you should now be in a better position to estimate how much you need to do for the tP (reason: the expected implementation effort for the tP is estimated with reference to the implementation effort required for a typical iP).


    iP: Week 7iP: Grading

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If both iPs crash or fail severely in a similar fashion, the problem may be on your side. Please contact the teaching team to ask how to proceed.
  • Take note of the effort required for a typical iP: After seeing two more iPs, you should now be in a better position to estimate how much you need to do for the tP (reason: the expected implementation effort for the tP is estimated with reference to the implementation effort required for a typical iP).

  • iP: Week 7iP: Grading

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/ip-w8.page-vue-render.js b/admin/ip-w8.page-vue-render.js index 025550fd68..49abbe6ad8 100644 --- a/admin/ip-w8.page-vue-render.js +++ b/admin/ip-w8.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('li',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Ta with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-w7.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Week 7")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-grading.html"}},[_c('span',[_v("iP: Grading "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/lectures.html b/admin/lectures.html index fb33a1a33d..5fc6c563a0 100644 --- a/admin/lectures.html +++ b/admin/lectures.html @@ -21,7 +21,7 @@
  • Weekly ScheduleTutorials


    Weekly Briefings

    Weekly briefing are short weekly sessions (>1hr) conducted by the course lecturer(s) to wrap up the current week and brief you about the upcoming week.

    This course does not have lectures, as the course is using the blended learning mode. Course content are delivered as an online textbook accompanied by pre-recorded videos, instead of using lectures as the main method of content delivery. We still have a lecture slot/venue though.

    In most weeks we use the lecture slot/venue for weekly briefings. In some weeks we use it for important events such as the practical exam.

    Timing/venue: UTown-AUD2 | Friday 1600-1800

    Mode:

    • The first weekly briefing will be released as a pre-recorded video.
    • From week 2, weekly briefing will be in hybrid mode (i.e., you can attend F2F or via Zoom or watch the recording later) from the 2nd week onwards. The Zoom link will be available in Canvas course homepage.

    Scope: A weekly briefing is usually about 1 hour, and aims to,

    • recap the past week, clarify common doubts
    • preview the next week
    • motivate you to tackle the weekly tasks coming up
    • contextualize various 'moving parts' of the course and keep you anchored to the 'big picture'

    Slides: Briefing slides will be uploaded to Canvas after the briefing. Those slides are not suited for printing or to be used as a reference during the lecture/exams. They are only an aid for briefing delivery.

    Attendance: Weekly briefings are optional to attend/watch. You are free to speed-watch the recording to save time (instead of joining live) or skip them altogether (if you are already saturated by the rest of the course activities).


    Weekly ScheduleTutorials

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Weekly ScheduleTutorials


    Weekly Briefings

    Weekly briefing are short weekly sessions (>1hr) conducted by the course lecturer(s) to wrap up the current week and brief you about the upcoming week.

    This course does not have lectures, as the course is using the blended learning mode. Course content are delivered as an online textbook accompanied by pre-recorded videos, instead of using lectures as the main method of content delivery. We still have a lecture slot/venue though.

    In most weeks we use the lecture slot/venue for weekly briefings. In some weeks we use it for important events such as the practical exam.

    Timing/venue: UTown-AUD2 | Friday 1600-1800

    Mode:

    • The first weekly briefing will be released as a pre-recorded video.
    • From week 2, weekly briefing will be in hybrid mode (i.e., you can attend F2F or via Zoom or watch the recording later) from the 2nd week onwards. The Zoom link will be available in Canvas course homepage.

    Scope: A weekly briefing is usually about 1 hour, and aims to,

    • recap the past week, clarify common doubts
    • preview the next week
    • motivate you to tackle the weekly tasks coming up
    • contextualize various 'moving parts' of the course and keep you anchored to the 'big picture'

    Slides: Briefing slides will be uploaded to Canvas after the briefing. Those slides are not suited for printing or to be used as a reference during the lecture/exams. They are only an aid for briefing delivery.

    Attendance: Weekly briefings are optional to attend/watch. You are free to speed-watch the recording to save time (instead of joining live) or skip them altogether (if you are already saturated by the rest of the course activities).


    Weekly ScheduleTutorials

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/lectures.page-vue-render.js b/admin/lectures.page-vue-render.js index e15355fb35..cf4df3b9b4 100644 --- a/admin/lectures.page-vue-render.js +++ b/admin/lectures.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Weekly Schedule")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_v("Tutorials "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('br'),_v(" "),_c('h1',{attrs:{"id":"weekly-briefings"}},[_c('span',{staticClass:"display-4"},[_v("Weekly Briefings")]),_v(" "),_c('span',{staticClass:"text-muted text-light",staticStyle:{"font-size":"15px"}},[_c('span',{staticClass:"badge rounded-pill bg-light text-primary"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#weekly-briefings","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',{staticClass:"lead text-secondary"},[_c('em',[_v("Weekly briefing")]),_v(" are short weekly sessions (>1hr) conducted by the course lecturer(s) to wrap up the current week and brief you about the upcoming week.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("This course does not have "),_c('em',[_v("lectures")])])]),_v(", as the course is using the "),_c('em',[_v("blended learning")]),_v(" mode. Course content are delivered as an online textbook accompanied by pre-recorded videos, instead of using lectures as the main method of content delivery. We still have a lecture slot/venue though.")]),_v(" "),_c('p',[_c('strong',[_v("In most weeks we use the lecture slot/venue for "),_c('em',[_v("weekly briefings")]),_v(".")]),_v(" In some weeks we use it for important events such as the practical exam.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Timing/venue")])]),_v(": "),_c('span',[_v("UTown-AUD2 | Friday "),_c('strong',[_v("1600")]),_v("-1800")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Mode")])]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("The first weekly briefing will be released as a pre-recorded video.")]),_v(" "),_c('li',[_v("From week 2, weekly briefing will be in "),_c('em',[_v("hybrid")]),_v(" mode (i.e., you can attend F2F or via Zoom or watch the recording later) from the 2nd week onwards. The Zoom link will be available in "),_c('a',{attrs:{"href":"https://canvas.nus.edu.sg/courses/64945"}},[_v("Canvas course homepage")]),_v(".")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('strong',[_c('strong',[_v("Scope")])]),_v(": A weekly briefing is usually about 1 hour, and aims to,")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("recap")]),_v(" the past week, clarify common doubts")]),_v(" "),_c('li',[_c('strong',[_v("preview")]),_v(" the next week")]),_v(" "),_c('li',[_c('strong',[_v("motivate")]),_v(" you to tackle the weekly tasks coming up")]),_v(" "),_c('li',[_c('strong',[_v("contextualize")]),_v(" various 'moving parts' of the course and keep you anchored to the 'big picture'")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Slides")])]),_v(": Briefing slides will be uploaded to Canvas "),_c('em',[_v("after")]),_v(" the briefing. Those slides are not suited for printing or to be used as a reference during the lecture/exams. They are only an aid for briefing delivery.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Attendance")])]),_v(": Weekly briefings are optional to attend/watch. You are free to speed-watch the recording to save time (instead of joining live) or skip them altogether (if you are already saturated by the rest of the course activities).")])])]),_v(" "),_c('br'),_v(" "),_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Weekly Schedule")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_v("Tutorials "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/mid-semester-survey-results.html b/admin/mid-semester-survey-results.html index ec6c2a3506..be03fb5672 100644 --- a/admin/mid-semester-survey-results.html +++ b/admin/mid-semester-survey-results.html @@ -149,7 +149,7 @@ from given resources is good practice for future, as such tools are emerge and evolve rapidly.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +‎
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/mid-semester-survey-results.page-vue-render.js b/admin/mid-semester-survey-results.page-vue-render.js index 353f92fa86..4e0feac2c0 100644 --- a/admin/mid-semester-survey-results.page-vue-render.js +++ b/admin/mid-semester-survey-results.page-vue-render.js @@ -257,6 +257,6 @@ with(this){return _c('div',[_c('p',[_v("There is way too much to read for the we with(this){return _c('div',[_c('p',[_v("IP's requirements can be a bit clearer, sometimes students do not know what is graded and what is not.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/overview-for-teachers.html b/admin/overview-for-teachers.html index 13f7521042..014557a46b 100644 --- a/admin/overview-for-teachers.html +++ b/admin/overview-for-teachers.html @@ -26,7 +26,7 @@ Students prefer: Full freedom to build whatever product they want, using their preferred tool stack, using simpler worflows (e.g., everyone commits to the master branch).

  • Our approach: Get students to test each others' products, report bugs, and respond to reported bugs.
    Rationale: To achieve a higher rigor in testing the quality of student work.
    Students prefer: Teaching team does all the evaluations.

  • Despite all the above (and more) unpopoular choices, the course continues to receive good student feedback, even in the face of increasing student numbers. Given below is the student feedback rating for CS2103T (semester 1) across recent years.

    Year Class size Course rating (dept average) Teacher rating (dept average)
    2018 113 3.8 (3.8) 4.1 (4.1)
    2019 117 4.0 (3.8) 4.4 (4.2)
    2020 242 4.0 (3.9) 4.3 (4.2)
    2021 294 4.2 (3.9) 4.5 (4.2)

    Achievement 3: Scaled up without losing rigor

    While SE courses are notoriously hard to scale, we have done reasonably well in scaling this course to 500 students, without a significant drop in rigor of evaluation (thanks to the practical exam), and without a significant increase in teaching resources (e.g., tutor hours). -Strategies used:

    1. Heavy use of automation: The course uses automation heavily (supported by about 20,000 LoC of Python scripts) e.g., generating dashboards from various sources of data. In addition, the course uses the following EdTech tools that were built by our students primarily to support this course but currently used by other courses as well:

    2. Leverage peer inputs: Students themselves contribute a lot to guiding/evaluating other students. For example, the iP is graded entirely by scripts and peers, except for a small number of cases (about 5%) that require tutor intervention.


    Future work

    The heavy workload remains a concern (in the mid-term survey, about 25% of the respondents said the workload is too heavy).

    Providing adequate and personalized help to struggling students is another challenge that becomes harder to do as the class size increases.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Strategies used:

    1. Heavy use of automation: The course uses automation heavily (supported by about 20,000 LoC of Python scripts) e.g., generating dashboards from various sources of data. In addition, the course uses the following EdTech tools that were built by our students primarily to support this course but currently used by other courses as well:

    2. Leverage peer inputs: Students themselves contribute a lot to guiding/evaluating other students. For example, the iP is graded entirely by scripts and peers, except for a small number of cases (about 5%) that require tutor intervention.


    Future work

    The heavy workload remains a concern (in the mid-term survey, about 25% of the respondents said the workload is too heavy).

    Providing adequate and personalized help to struggling students is another challenge that becomes harder to do as the class size increases.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/overview-for-teachers.page-vue-render.js b/admin/overview-for-teachers.page-vue-render.js index a5b8d09da6..eebb26d9fc 100644 --- a/admin/overview-for-teachers.page-vue-render.js +++ b/admin/overview-for-teachers.page-vue-render.js @@ -161,6 +161,6 @@ with(this){return _c('h1',{attrs:{"id":"future-work"}},[_v("Future work"),_c('a' with(this){return _c('p',[_v("The heavy workload remains a concern (in the "),_c('a',{attrs:{"href":"/website/admin/mid-semester-survey-results.html"}},[_v("mid-term survey")]),_v(", about 25% of the respondents said the workload is too heavy).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/participation.html b/admin/participation.html index 645be248d4..8c310b0241 100644 --- a/admin/participation.html +++ b/admin/participation.html @@ -25,7 +25,7 @@
    • Quizzes open around the weekly briefing time and stay open until the next briefing starts. In some weeks, there will be two quizzes (because two smaller quiz is easier for you to manage than one big quiz).
    • If multiple attempts are allowed, we take the best attempt, not the latest attempt.
    • When awarding participation points for quizzes, we look for two conditions:
      • Condition 1: submitted early i.e., within four days of the briefing i.e., briefing day (Friday) + four more days -> Tuesday (reason: to encourage learning the weekly topics before doing the weekly tasks)
      • Condition 2: answered correctly i.e., least 70% of the answers are correct (reason: to discourage random answers)
    • You earn:
      • 3 points if both conditions are satisfied.
      • 2 points if only one condition is satisfied.
      • 1 point if submitted but both conditions are unsatisfied.
  • Other activities related to the course (e.g., submitting a survey) can earn participation points too. -
    • Such participation-graded activities can be identified by the icon .
    • Each such activity earns 2 points unless specified otherwise.
    • Refer the activity description for evaluation criteria.
  • If you earn at least half of points on offer in a particular week, you are considered as 'participated' in that week e.g., suppose a particular week has a weekly quiz (worth 3 points) and a peer evaluation submission worth 2 points. You need to earn at least 3 (out of the total 5) points to be considered as 'participated' in that week.

  • To satisfy condition A, you need to participate in at least 10 (out of 13) weeks of the semester. All 13 weeks of the semester has participation activities.

  • B Received good peer evaluations

    • -1 for each professional conduct criterion in which you are rated low by team members. 'Rated low' is receiving multiple Below Average or Poor ratings.

    • No penalty for scoring low on competency criteria.

    C Sufficient tutorial attendance/participation

    • -1 mark if participated in fewer than 7 tutorials. To consider as 'participated' in a tutorial, you need to show a sufficient level of participation (just attending is not enough).

    + Bonus Marks

    In addition, you can receive bonus marks in the following ways. Bonus marks can be used to top up your participation marks but only if your marks from the above falls below 5.

    • [For briefing participation] Participated in briefing activities (e.g., in polls/quizzes done during the briefing) in at least 10 briefings: 1 mark
    • [For in-video quizzes] Answered in-video quizzes in at least 7 weeks: 1 mark
      Starting from week 3, some pre-recorded videos in the Topics tab will contain in-video quizzes. Videos containing quizzes are labelled Video Q+ (instead of the usual Video)
    • [For perfect peer ratings] Received good ratings for all 10 peer evaluations criteria: 1 mark
    • [For helping classmates] Was very helpful to classmates e.g., multiple helpful posts in forum: 1 mark

    Examples:

    • Alicia earned 1/2, 3/5, 2/5, 5/5, 5/5, 5/5, 5/5, 5/5, 5/5, 5/5, 4/5, 5/5 in the first 12 weeks. As she received at least half of the points in 11 of the weeks, she gets 5 participation marks. Bonus marks are not applicable as she has full marks already.
    • Benjamin managed to get at least half of the participation points in 9 weeks only, which gives him 5-1 = 4 participation marks. But he participated in 10 briefings, and hence get a bonus mark to make it 5/5.
    • Chun Ming met the participation points bar in 8 weeks only, giving him 5-2 = 3 marks. He lost 2 more marks because he received multiple negative ratings for two criteria, giving him 1/5 participation marks.

    FAQ:

    • Q: What if I missed a participation task due to a legitimate reason? (e.g., falling sick, taking part in university event)
      A: See the panel below:

    Where to find your participation marks progress

    Your participation progress can be tracked in this page from week 3 onward.



    ExamsGrade Breakdown

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Such participation-graded activities can be identified by the icon .
    • Each such activity earns 2 points unless specified otherwise.
    • Refer the activity description for evaluation criteria.
  • If you earn at least half of points on offer in a particular week, you are considered as 'participated' in that week e.g., suppose a particular week has a weekly quiz (worth 3 points) and a peer evaluation submission worth 2 points. You need to earn at least 3 (out of the total 5) points to be considered as 'participated' in that week.

  • To satisfy condition A, you need to participate in at least 10 (out of 13) weeks of the semester. All 13 weeks of the semester has participation activities.

  • B Received good peer evaluations

    • -1 for each professional conduct criterion in which you are rated low by team members. 'Rated low' is receiving multiple Below Average or Poor ratings.

    • No penalty for scoring low on competency criteria.

    C Sufficient tutorial attendance/participation

    • -1 mark if participated in fewer than 7 tutorials. To consider as 'participated' in a tutorial, you need to show a sufficient level of participation (just attending is not enough).

    + Bonus Marks

    In addition, you can receive bonus marks in the following ways. Bonus marks can be used to top up your participation marks but only if your marks from the above falls below 5.

    • [For briefing participation] Participated in briefing activities (e.g., in polls/quizzes done during the briefing) in at least 10 briefings: 1 mark
    • [For in-video quizzes] Answered in-video quizzes in at least 7 weeks: 1 mark
      Starting from week 3, some pre-recorded videos in the Topics tab will contain in-video quizzes. Videos containing quizzes are labelled Video Q+ (instead of the usual Video)
    • [For perfect peer ratings] Received good ratings for all 10 peer evaluations criteria: 1 mark
    • [For helping classmates] Was very helpful to classmates e.g., multiple helpful posts in forum: 1 mark

    Examples:

    • Alicia earned 1/2, 3/5, 2/5, 5/5, 5/5, 5/5, 5/5, 5/5, 5/5, 5/5, 4/5, 5/5 in the first 12 weeks. As she received at least half of the points in 11 of the weeks, she gets 5 participation marks. Bonus marks are not applicable as she has full marks already.
    • Benjamin managed to get at least half of the participation points in 9 weeks only, which gives him 5-1 = 4 participation marks. But he participated in 10 briefings, and hence get a bonus mark to make it 5/5.
    • Chun Ming met the participation points bar in 8 weeks only, giving him 5-2 = 3 marks. He lost 2 more marks because he received multiple negative ratings for two criteria, giving him 1/5 participation marks.

    FAQ:

    • Q: What if I missed a participation task due to a legitimate reason? (e.g., falling sick, taking part in university event)
      A: See the panel below:

    Where to find your participation marks progress

    Your participation progress can be tracked in this page from week 3 onward.



    ExamsGrade Breakdown

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/participation.page-vue-render.js b/admin/participation.page-vue-render.js index 18356f8c25..f6a8679528 100644 --- a/admin/participation.page-vue-render.js +++ b/admin/participation.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Q: What if I missed a parti with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/exams.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Exams")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_c('span',[_v("Grade Breakdown "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/peerEvaluations.html b/admin/peerEvaluations.html index 4c3fd3637c..a74232216d 100644 --- a/admin/peerEvaluations.html +++ b/admin/peerEvaluations.html @@ -28,7 +28,7 @@ You may omit this question for members who have not submitted the PPP.

    Q Rank team members based on their ability/potential to lead a software project team (rank 1 is strongest)

    Session: Responses to Peer Evaluations

    • This is a chance for you to submit your objections to the ratings you received in the Final Peer Evaluation.

    How peer evaluations are used

    • Peer evaluations are rarely used directly to calculate marks. They are mostly used to flag cases that need further investigation.
    • When investigating such cases to decide if and how much the marks should be adjusted based on peer evaluations, we consider factors such as the following:
      • Is there a consensus among team members? We do not want an extreme input from one team member to unduly affect the outcome. In many cases, we discard the highest and lowest ratings received before calculating the average.
      • Do the other data points (e.g., LoC written, tutor feedback, commit history) corroborates the peer evaluations?
    • In some cases, a lower contribution rating given be peers (even if corroborated by other data) might not affect marks at all e.g., if the lower contribution still meets the bar for earning full marks for that component.

    Guidelines for giving peer feedback

    Giving constructive feedback to others is a valuable skill for software engineers. It is also an intended learning outcome of this course. Half-hearted/trivial feedback will not earn participation marks.

    Here are some things to keep in mind:

    • Assume you are giving feedback to a colleague, not a friend. Keep the tone of your feedback reasonably professional. Do not use offensive language or slang.
    • The feedback should be honest and consistent. Giving positive qualitative feedback (e.g. Thanks for all the hard work! and negative ratings (e.g. Equal share - 40%) to the same team member is not being honest.
    • State your expectations early. All too often students give positive/neutral feedback early (hoping that the team member will improve later) and trash the team member in the final evaluation (because the he/she did not improve as expected). However, this could be confusing to the recipient. It is better to give negative feedback early so that the team member gets a clear signal that he/she needs to improve.

    Guidelines for interpreting contribution ratings

    When you receive results of a peer evaluation question about contribution, use it mainly to compare the team view to your own view.

    • Example 1:
      Your view (of your own contribution) : E+10% i.e., 10% more than an equal share
      Team view (of your own contribution): E+8%
      Conclusion: The team's view is quite similar to yours.
    • Example 2:
      Your view (of your own contribution) : E+15% i.e., 10% more than an equal share
      Team view (of your own contribution): E+3%
      -Conclusion: The team's thinks you did significantly less than you claimed you did.

    tP: Supervision/GuidanceTools

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Conclusion: The team's thinks you did significantly less than you claimed you did.

    tP: Supervision/GuidanceTools

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/peerEvaluations.page-vue-render.js b/admin/peerEvaluations.page-vue-render.js index 2c40cbea8c..101b0d9cf2 100644 --- a/admin/peerEvaluations.page-vue-render.js +++ b/admin/peerEvaluations.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('span',{attrs:{"id":"giving-peer-feedback"}},[_c('h3',{attr with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Supervision/Guidance")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tools.html"}},[_c('span',[_v("Tools "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/programmingLanguages.html b/admin/programmingLanguages.html index 70db59e268..3d0fde0e06 100644 --- a/admin/programmingLanguages.html +++ b/admin/programmingLanguages.html @@ -25,7 +25,7 @@ Java for all programming activities, the project, and exam answers.

    The course doesn’t “teach” Java. We assume you already know Java basics. We expect you to learn on your own any Java constructs not covered in your previous courses. The exam expects you to know Java to the extent that you should be familiar with it as a result of using it in the course exercises/projects. -

    Preparation:

    We require you to use Java 17 (the Oracle version or another alternative such as the OpenJDK version) for all course work. It is your duty to ensure the code you write (and executables you produce) are compatible with that version of Java. Any incompatibilities will be considered as bugs.

    If you have Java 8 (a particularly 'sticky' version of Java) in your computer, we recommend removing it, to prevent using it unintentionally.

    [IMPORTANT] Advisory for Mac users

    Mac users should use the specific Azul JDK 17 distribution specified in this guide.

    To reiterate, it is not enough that you have Java 17, it needs to be the precise Azul JDK+JavaFX version specified in the page linked above.


    FAQ Why not move to a newer Java version (e.g., 21)?



    TextbooksStandards/Conventions

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Preparation:

    We require you to use Java 17 (the Oracle version or another alternative such as the OpenJDK version) for all course work. It is your duty to ensure the code you write (and executables you produce) are compatible with that version of Java. Any incompatibilities will be considered as bugs.

    If you have Java 8 (a particularly 'sticky' version of Java) in your computer, we recommend removing it, to prevent using it unintentionally.

    [IMPORTANT] Advisory for Mac users

    Mac users should use the specific Azul JDK 17 distribution specified in this guide.

    To reiterate, it is not enough that you have Java 17, it needs to be the precise Azul JDK+JavaFX version specified in the page linked above.


    FAQ Why not move to a newer Java version (e.g., 21)?



    TextbooksStandards/Conventions

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/programmingLanguages.page-vue-render.js b/admin/programmingLanguages.page-vue-render.js index 5f9f3da646..300f047421 100644 --- a/admin/programmingLanguages.page-vue-render.js +++ b/admin/programmingLanguages.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('td',[_c('p',[_c('strong',[_v("The main language used in th with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/textbooks.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Textbooks")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_c('span',[_v("Standards/Conventions "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/reposenseAuthorAnnotation.html b/admin/reposenseAuthorAnnotation.html index ec431c686f..e2a03e17c6 100644 --- a/admin/reposenseAuthorAnnotation.html +++ b/admin/reposenseAuthorAnnotation.html @@ -299,7 +299,7 @@ -
  • You can use empty @@author tags to mark code as not yours when RepoSense attribute the code to you incorrectly.

    • Code generated by the IDE/framework, should not be annotated as your own.

    • Code you modified in minor ways e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.

  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
  • You can use empty @@author tags to mark code as not yours when RepoSense attribute the code to you incorrectly.

    • Code generated by the IDE/framework, should not be annotated as your own.

    • Code you modified in minor ways e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.

  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/reposenseAuthorAnnotation.page-vue-render.js b/admin/reposenseAuthorAnnotation.page-vue-render.js index d8e1204883..3954dd7104 100644 --- a/admin/reposenseAuthorAnnotation.page-vue-render.js +++ b/admin/reposenseAuthorAnnotation.page-vue-render.js @@ -68,6 +68,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c(' with(this){return _c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/standardsAndConventions.html b/admin/standardsAndConventions.html index 4ec97c7d5a..7711e78edc 100644 --- a/admin/standardsAndConventions.html +++ b/admin/standardsAndConventions.html @@ -22,7 +22,7 @@
  • Programming LanguageiP (Individual Project): Overview


    Standards/Conventions

    Given below are the standards and conventions to follow in this course.

    When something is not covered by the given standard/convention, you are free to choose which style you want to follow for that, but try to be consistent with the existing code (if any), and ensure everyone in the team follows the same (if it is a team project).

    Java
    Git
    • REQUIRED Follow the Git commit message subject conventions in the SE-EDU Git conventions.
    • CONDITIONAL Writing a commit message body is optional, but if you do write one, follow at least basic conventions for the commit message body.
    Markdown
    Documentation

    Programming LanguageiP (Individual Project): Overview

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Programming LanguageiP (Individual Project): Overview

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/standardsAndConventions.page-vue-render.js b/admin/standardsAndConventions.page-vue-render.js index c7660399f2..bf49647a4a 100644 --- a/admin/standardsAndConventions.page-vue-render.js +++ b/admin/standardsAndConventions.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('span',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('h5',{att with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/programmingLanguages.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Programming Language")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_v("iP (Individual Project): Overview "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/teamList.html b/admin/teamList.html index 86b6b5b3a8..381b659d97 100644 --- a/admin/teamList.html +++ b/admin/teamList.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    tP Teams

    CS2103T-W08


    CS2103T-W09


    CS2103T-W10


    CS2103T-W11


    CS2103T-W12


    CS2103T-W13


    CS2103T-W14


    CS2103T-T08


    CS2103T-T09


    CS2103T-T10


    CS2103T-T11


    CS2103T-T12


    CS2103T-T13


    CS2103T-T14


    CS2103T-T15


    CS2103T-T16


    CS2103T-T17


    CS2103T-F08


    CS2103T-F09


    CS2103-F09


    CS2103T-F10


    CS2103-F10


    CS2103T-F11


    CS2103-F11


    CS2103-F12


    CS2103T-F12


    CS2103T-F13


    CS2103-F13


    CS2103T-F15


    CS2103T-F14a


    CS2103T-F14b


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    tP Teams

    CS2103T-W08


    CS2103T-W09


    CS2103T-W10


    CS2103T-W11


    CS2103T-W12


    CS2103T-W13


    CS2103T-W14


    CS2103T-T08


    CS2103T-T09


    CS2103T-T10


    CS2103T-T11


    CS2103T-T12


    CS2103T-T13


    CS2103T-T14


    CS2103T-T15


    CS2103T-T16


    CS2103T-T17


    CS2103T-F08


    CS2103T-F09


    CS2103-F09


    CS2103T-F10


    CS2103-F10


    CS2103T-F11


    CS2103-F11


    CS2103-F12


    CS2103T-F12


    CS2103T-F13


    CS2103-F13


    CS2103T-F15


    CS2103T-F14a


    CS2103T-F14b


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/teamList.page-vue-render.js b/admin/teamList.page-vue-render.js index 8572d22c9e..e3941c84f2 100644 --- a/admin/teamList.page-vue-render.js +++ b/admin/teamList.page-vue-render.js @@ -1,13 +1,13 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_m(0),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w08"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w08"}},[_v("CS2103T-W08"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-1-trackmate"}},[_v("CS2103T-W08-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TrackMate]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-1-trackmate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNUS SOC tutors who want to track their student's progress\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTrackMate offers a comprehensive application for educators to track their students’ current progress. It is optimized for educators who are proficient in Command Line Interface (CLI) and help them to reduce their workload and administrative burden.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1YGD-vDEcytXXLx873y6jvkZutBmx2wYJAXvABaOuchU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SamsonChew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SamsonChew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/samsonchew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/samsonchew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samsonchew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3ASamsonChew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FUI .. MIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Fui03"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Fui03")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/fui03.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/fui03.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fui03&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3AFui03"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LO Y.. ZHE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Reallyeasy1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Reallyeasy1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/reallyeasy1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/reallyeasy1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=reallyeasy1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3AReallyeasy1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..HIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tansanchian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tansanchian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/tansanchian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/tansanchian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tansanchian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3Atansanchian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEH ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/waihongteh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("waihongteh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/waihongteh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/waihongteh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=waihongteh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3Awaihongteh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-2-eduvault"}},[_v("CS2103T-W08-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Eduvault]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-2-eduvault","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for admin at tuition centres and has to track a large number of student records.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnable easy management and fast access to student records for administrators working at tuition centres. We aim to provide easy tracking of payments to send reminders, learning progress of students and shifting of classes etc. This also helps tuition centres save time by reducing administrative burdens on their staff.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1bzjxhKceeUBWXWcnQ8U4miSz4XrGIcpUZvtr6_56uy0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMIT..TURI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/amitha2210"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("amitha2210")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/amitha2210.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/amitha2210.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=amitha2210&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3Aamitha2210"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GLAD.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gladwintan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gladwintan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/gladwintan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/gladwintan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gladwintan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3Agladwintan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE .. HUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/BlazeChron"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("BlazeChron")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/blazechron.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/blazechron.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=blazechron&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3ABlazeChron"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YOU ..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Slipperybara"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Slipperybara")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/slipperybara.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/slipperybara.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slipperybara&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3ASlipperybara"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN..NHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jinhanjinhan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jinhanjinhan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/jinhanjinhan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/jinhanjinhan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jinhanjinhan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3Ajinhanjinhan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-3-edumanage"}},[_v("CS2103T-W08-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduManage]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-3-edumanage","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTuition teachers. Grace, a 35-year-old experienced tuition teacher, juggles managing multiple classes and student details across different subjects. She often struggles to keep track of each student's progress, lesson, and specific learning needs, resulting in a lack of personalized attention during lessons.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEduManage provides a robust and intuitive platform for tuition teachers to manage student information efficiently. Optimized for those who prefer a fast, typing-based interface, it offers powerful tools for tracking student progress and lessons, ensuring that teachers can deliver customized learning experiences while maintaining strong connections with their students.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/11WVLSJ-gmkMSVZBulD32zuu4OT0KyHq5gNBcrNheeEE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("EYU ..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/EyuGongYi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("EyuGongYi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/eyugongyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/eyugongyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=eyugongyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3AEyuGongYi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..THAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/EthanLoww"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("EthanLoww")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/ethanloww.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/ethanloww.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethanloww&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3AEthanLoww"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIDD..GALA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Siddardar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Siddardar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/siddardar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/siddardar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=siddardar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3ASiddardar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SKYL.. ZEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/skyl3-r"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("skyl3-r")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/skyl3-r.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/skyl3-r.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=skyl3-r&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3Askyl3-r"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THAD..E AN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/foothaddeus"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foothaddeus")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/foothaddeus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/foothaddeus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=foothaddeus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3Afoothaddeus"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-4-goonbook"}},[_v("CS2103T-W08-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("GoonBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-4-goonbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrimary School Teachers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA streamlined tool designed to simplify classroom management, allowing teachers to effortlessly organize student information, track academic progress, and enhance communication with parents—all within a secure, easy-to-use platform.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1qx_FKm62aor2mPiKXBL--gqbAb0bY5ibzaNDMa_Bfus/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BEH .. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wenjebs"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wenjebs")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/wenjebs.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/wenjebs.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wenjebs&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Awenjebs"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MART..N NG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/martout2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("martout2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/martout2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/martout2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=martout2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Amartout2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHAU..SIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Hoodini231"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Hoodini231")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/hoodini231.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/hoodini231.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hoodini231&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3AHoodini231"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SONG..HYUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hyxnnii"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hyxnnii")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/hyxnnii.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/hyxnnii.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hyxnnii&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Ahyxnnii"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YIM ..BING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yimjianbing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yimjianbing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/yimjianbing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/yimjianbing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yimjianbing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Ayimjianbing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w09"}},[_v("CS2103T-W09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-1-hiredfiredpro"}},[_v("CS2103T-W09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HiredFiredPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-1-hiredfiredpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInterviewers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTo be able to quickly identify potential candidates based on their skills and passed interview stages. Interviewers can also quickly identify those with more experience or those who have a high interview score. Interviewee status is displayed along with relevant position details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1AL-ENlH8iL_K3LntiQeSGzJyOVgDMsroufbpVdtgpyk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ADIB..ENDY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bigismols"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bigismols")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/bigismols.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/bigismols.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bigismols&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3Abigismols"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DERR.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LemonDrew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LemonDrew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/lemondrew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/lemondrew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lemondrew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3ALemonDrew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KUSH.. DAS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kushaldas27"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kushaldas27")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/kushaldas27.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/kushaldas27.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kushaldas27&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3Akushaldas27"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..EWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/oolongwater"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("oolongwater")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/oolongwater.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/oolongwater.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=oolongwater&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3Aoolongwater"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHU ..HIQI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SQ77"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SQ77")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/sq77.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/sq77.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sq77&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3ASQ77"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-2-edulog"}},[_v("CS2103T-W09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduLog]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-2-edulog","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTyping preferred, single user: Tuition teachers who prefer a typing-based interface and manage their tuition business independently.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReduce the time needed for data entry through efficient shorthands. Simplify the tracking of schedules, student data, and financials. Provide comprehensive reporting features to help manage and grow the tuition business effectively. Enhanced organization and reduced administrative workload. Improved accuracy in tracking and reporting. Efficient data management and entry.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1dDyYxxcIXLh3hifpnzTw_JGkn09HsnKbSZ896spgmpk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH.. SEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/josh1248"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("josh1248")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/josh1248.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/josh1248.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=josh1248&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Ajosh1248"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KIMA..JARI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kimxw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kimxw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/kimxw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/kimxw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kimxw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Akimxw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NATH..SHEW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nathanshew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nathanshew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/nathanshew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/nathanshew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nathanshew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Anathanshew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SULT..KHIL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Timenikhil"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Timenikhil")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/timenikhil.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/timenikhil.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=timenikhil&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3ATimenikhil"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THEO.. LIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/obrona"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("obrona")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/obrona.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/obrona.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=obrona&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Aobrona"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-3-hireme"}},[_v("CS2103T-W09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HireMe]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-3-hireme","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNUS students applying for hundreds of internships in their semester break\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNUS students may apply to hundreds of internships over the various semesters. Our CLI application makes it easy and convenient for them to keep track of the companies and status of their applications.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1rVGHfGMRMx83aC37cQ4dj1-loototgEdIz9UZD5J78o/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..YLAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/choaticman"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("choaticman")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/choaticman.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/choaticman.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=choaticman&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3Achoaticman"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIT..AIDU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Raghava-Chittidi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Raghava-Chittidi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/raghava-chittidi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/raghava-chittidi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=raghava-chittidi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3ARaghava-Chittidi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..ELLY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/woke02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("woke02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/woke02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/woke02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=woke02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3Awoke02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU X..TING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/snowstopxt"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("snowstopxt")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/snowstopxt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/snowstopxt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=snowstopxt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3Asnowstopxt"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZWE ..ZEYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ZweZeya"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ZweZeya")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/zwezeya.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/zwezeya.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zwezeya&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3AZweZeya"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-4-dormanagerpro"}},[_v("CS2103T-W09-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("DorManagerPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-4-dormanagerpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUniversity Dormitory manager (Teacher residents and admins at Dorm Halls)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide fast and centralised access to vital resident information such as their room numbers, roles (e.g. Residential Assistants, Club Managers) and emergency contacts, optimised for dormitory managers who prefer CLIs. Also allows for quick input of details and querying by different conditions for dorm managers of large dorms.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/16EYTVLtzzNR21NZ9eMuhx-zErOA8gGKAKUTxh5Tc_68/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOO..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chashaobao123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chashaobao123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/chashaobao123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/chashaobao123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chashaobao123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3Achashaobao123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HE S.. SHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lancehaha"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lancehaha")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/lancehaha.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/lancehaha.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lancehaha&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3Alancehaha"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI Y..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/charlesliyifeng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("charlesliyifeng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/charlesliyifeng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/charlesliyifeng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=charlesliyifeng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3Acharlesliyifeng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..SUEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SeanFoongjt"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SeanFoongjt")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/seanfoongjt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/seanfoongjt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seanfoongjt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3ASeanFoongjt"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEO .. EDA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/EdaYeo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("EdaYeo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/edayeo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/edayeo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=edayeo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3AEdaYeo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w10"}},[_v("CS2103T-W10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-1-teacher-s-pet"}},[_v("CS2103T-W10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Teacher’s Pet]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-1-teacher-s-pet","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching assistants who manage students information and need an efficient way to track academic progress, contact details, and other relevant data for each student.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeacher’s Pet streamlines the management of student information by consolidating contact details, grades, and additional pertinent data into one accessible platform. This efficient tool simplifies tracking student performance and communication, enhancing organisational efficiency for teaching assistants.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/19BhXM0_3YqI4gJybXwTxaA_3uHR83LkMIPQHIuE-RCA/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AGAR..SHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ishan-agarwal-05"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ishan-agarwal-05")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/ishan-agarwal-05.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/ishan-agarwal-05.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ishan-agarwal-05&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3Aishan-agarwal-05"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GABR..INGS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gabriellegtw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gabriellegtw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/gabriellegtw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/gabriellegtw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gabriellegtw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3Agabriellegtw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH..KEAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NicholasT1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NicholasT1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/nicholast1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/nicholast1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholast1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3ANicholasT1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WILL..AYAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Wnayar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Wnayar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/wnayar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/wnayar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wnayar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3AWnayar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-2-doctrack"}},[_v("CS2103T-W10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("DocTrack]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-2-doctrack","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is intended for General Practitioners (GPs) at small clinics who need to keep track of recurring patients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTime spent looking through paper medical documents should be spent in other live-saving activities. Our product resolves this issue by creating fast access to patient contact details as well as their relevant appointment/treatment details, allowing GPs to contact and monitor their patients easily.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1BfedIDMpQ-bFukE8xjMGbNzUoEgmYmP3E7am3cIPs8A/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOI..YEOK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/choiwab"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("choiwab")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/choiwab.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/choiwab.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=choiwab&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Achoiwab"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JO A..O AN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jayjay19630"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jayjay19630")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/jayjay19630.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/jayjay19630.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jayjay19630&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Ajayjay19630"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..SANI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zaidansani"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zaidansani")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/zaidansani.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/zaidansani.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zaidansani&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Azaidansani"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RACH.. JIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rxchell"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rxchell")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/rxchell.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/rxchell.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rxchell&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Arxchell"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SACH..GMAY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Vangmay"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Vangmay")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/vangmay.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/vangmay.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vangmay&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3AVangmay"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-3-agentconnect"}},[_v("CS2103T-W10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AgentConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-3-agentconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for insurance agent who wants to keep track of all client details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvides quick and efficient access to client details, tailored for insurance agents who need a streamlined interface to manage contacts, track policy updates, and schedule client follow-ups via CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1vkqziV6U4XH3ECFGYcsYsMWubnQDuxkVCK_RzP3D0cs/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AW M..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MingYiAw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MingYiAw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/mingyiaw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/mingyiaw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mingyiaw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AMingYiAw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DENO..ZONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SSirMentos"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SSirMentos")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/ssirmentos.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/ssirmentos.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ssirmentos&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3ASSirMentos"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("EDWI..HUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Edwin1022"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Edwin1022")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/edwin1022.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/edwin1022.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=edwin1022&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AEdwin1022"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MANT.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/M-kew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("M-kew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/m-kew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/m-kew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=m-kew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AM-kew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG .. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/The0nlyJuan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The0nlyJuan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/the0nlyjuan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/the0nlyjuan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=the0nlyjuan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AThe0nlyJuan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-4-storeclass"}},[_v("CS2103T-W10-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("StoreClass]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-4-storeclass","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA teacher in an educational institution with many students to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIt allows for easy and efficient retrieval or storage of student information while providing a clean and user-friendly interface. The application supports modularity, and users are able to import and export to other similar applications. Users will not need to rely on complex or costly software.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1GULAVZHn4ZjgwoqhZkIP2ttCVEGB21o5CT4hg_uf8N4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("COLL..U QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tanyqcollin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tanyqcollin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/tanyqcollin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/tanyqcollin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tanyqcollin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3Atanyqcollin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA.. ZAC")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/isaactodo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("isaactodo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/isaactodo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/isaactodo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=isaactodo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3Aisaactodo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEI ..NWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jianwen0451"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jianwen0451")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/jianwen0451.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/jianwen0451.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jianwen0451&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3AJianwen0451"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..QUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yongqqqq"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yongqqqq")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/yongqqqq.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/yongqqqq.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yongqqqq&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3Ayongqqqq"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEE ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RadieonAjax"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RadieonAjax")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/radieonajax.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/radieonajax.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=radieonajax&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3ARadieonAjax"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w11"}},[_v("CS2103T-W11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-1-murphy-s-list"}},[_v("CS2103T-W11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Murphy's List]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-1-murphy-s-list","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur target users are administrative assistants for palliative care facilities. Palliative care patients have varying chronic conditions that require different treatments and frequencies of visits. A system is necessary to ensure proper management of patient information, for our target users to easily access and disseminate information to the right personnel.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur CLI-based application offers efficient text-based navigation and access to patient data, allowing the quick retrieval and logging of critical patient information. With an intuitive (and potentially customizable) command structure, it streamlines data management and enhances the visualisation of patient conditions and routines under the facility.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1TEZfBfEkIeLyWPB541WOF7XvF1_-D3zP7yILwgyDeuc/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DOMI..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Dominic-Khoo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Dominic-Khoo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/dominic-khoo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/dominic-khoo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dominic-khoo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3ADominic-Khoo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HO C..RMAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/itsnotsherm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("itsnotsherm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/itsnotsherm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/itsnotsherm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itsnotsherm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Aitsnotsherm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..TONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lim-jt"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lim-jt")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/lim-jt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/lim-jt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lim-jt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Alim-jt"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("REID.. ONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/reidenong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reidenong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/reidenong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/reidenong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=reidenong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Areidenong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/volleyballkickedme"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("volleyballkickedme")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/volleyballkickedme.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/volleyballkickedme.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=volleyballkickedme&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Avolleyballkickedme"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-2-ab3-my-guest"}},[_v("CS2103T-W11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AB3-My-Guest]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-2-ab3-my-guest","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWedding planners\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAB3-My-Guest centralises guest information for wedding planners. It will help manage the contact details and RSVP status of a small number of invitees (only one wedding event at once). It reduces time taken for wedding planners to filter and contact the invitees, allowing them to focus on the wedding programme.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1zPRaAkgmsifjICHYZOyPwT8zvQK4JcoSZXpHYLdOKMg/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW..HONN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zeonchew0324"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zeonchew0324")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/zeonchew0324.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/zeonchew0324.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zeonchew0324&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Azeonchew0324"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW..RMAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SherChew27"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SherChew27")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/sherchew27.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/sherchew27.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sherchew27&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3ASherChew27"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HARI..ZLAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/harithh07"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("harithh07")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/harithh07.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/harithh07.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=harithh07&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Aharithh07"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOH .. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jiaxinnns"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jiaxinnns")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/jiaxinnns.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/jiaxinnns.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiaxinnns&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Ajiaxinnns"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..AVAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kvernnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kvernnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/kvernnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/kvernnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kvernnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Akvernnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-3-academyassist"}},[_v("CS2103T-W11-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AcademyAssist]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-3-academyassist","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for user who work in Management Team of Small Tuition Centre of Primary School Children that has a lot of staff and student details to keep track of\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe specialized contact book for managing a tuition center solves the problem of disorganized student and parent information. It centralizes contact details, tracks student data such as age, class, and tuition fees, maintains a teacher directory, and offers functions that improve administrative efficiency and organization.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ctmZ1AX0uewAxyaZBUav-L6cqo3cKI8AkWCyHEhwGs8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON.. JIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/cweijin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cweijin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/cweijin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/cweijin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cweijin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Acweijin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HING..XING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JoanneHing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JoanneHing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/joannehing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/joannehing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=joannehing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3AJoanneHing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KHOO..YIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/annabellekk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("annabellekk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/annabellekk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/annabellekk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=annabellekk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Aannabellekk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..RIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/adriantan101"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("adriantan101")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/adriantan101.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/adriantan101.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=adriantan101&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Aadriantan101"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..THAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ethanwangkangen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ethanwangkangen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/ethanwangkangen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/ethanwangkangen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethanwangkangen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Aethanwangkangen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-4-physiopal"}},[_v("CS2103T-W11-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PhysioPal]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-4-physiopal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPhysiotherapists with a large client base who prefer typing over other means of input, thus require an organised system to manage the details of the clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA cost-effective, customisable solution for managing patient contacts, scheduling appointments, tracking treatment history, and generating health progress reports, all without subscription or licensing fees. It saves time, money, and manpower on repetitive tasks, allowing flexibility to tailor the address book to specific needs.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/15AnFMT_zHZRNNbjhRKWpijDrz_K-yvBVzghELigwnPU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BHUD..ANIT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JumpyJay"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JumpyJay")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/jumpyjay.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/jumpyjay.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jumpyjay&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3AJumpyJay"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..A YE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jiayr99"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jiayr99")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/jiayr99.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/jiayr99.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiayr99&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3Ajiayr99"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIN ..MINE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jasmiinee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jasmiinee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/jasmiinee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/jasmiinee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jasmiinee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3Ajasmiinee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("REN ..PENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/GuanpengR"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GuanpengR")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/guanpengr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/guanpengr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=guanpengr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3AGuanpengR"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SARA..I EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sarahteonin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sarahteonin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/sarahteonin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/sarahteonin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sarahteonin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3Asarahteonin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w12"}},[_v("CS2103T-W12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-1-blitzbiz"}},[_v("CS2103T-W12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BlitzBiz]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-1-blitzbiz","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSmall business owners, sole proprietorships (e.g. home bakeries, crochet makers, home based nail services, private tutors, etc)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSince these businesses are single-individual teams, keeping track of different stakeholders alone is a hassle. These individuals work on their computers at least for their networking purposes, making the product compatible with their existing workflows. The product is an easy-to-use contact management app that manages customers, business partners and suppliers.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Lz_cMygknQ8aact2zBQqGp81PY8BNzwbCXAlMVEh1-g/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIU ..UJIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LiuYJ2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LiuYJ2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/liuyj2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/liuyj2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=liuyj2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3ALiuYJ2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..A EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jiaaaaen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jiaaaaen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/jiaaaaen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/jiaaaaen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiaaaaen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3Ajiaaaaen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yiiilonggg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yiiilonggg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/yiiilonggg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/yiiilonggg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yiiilonggg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3Ayiiilonggg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZON .. HUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zlch"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zlch")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/zlch.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/zlch.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zlch&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3Azlch"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-2-volunteams"}},[_v("CS2103T-W12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Volunteams]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-2-volunteams","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNonprofits and Community Organizations\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nit helps to track volunteer hours, donor information and donations. it can also help to organise events, send invites, manage RSVPs, and enable bulk messaging to different groups\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1yTd_OrZnNOPDNbuhetN6YV8RH6wS0pMMnamC1O73d-A/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KAN ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Fluffykan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Fluffykan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/fluffykan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/fluffykan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fluffykan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3AFluffykan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KEER..THIK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/keerthigkaarthik"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("keerthigkaarthik")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/keerthigkaarthik.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/keerthigkaarthik.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=keerthigkaarthik&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3Akeerthigkaarthik"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JovenSoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JovenSoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/jovensoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/jovensoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jovensoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3AJovenSoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TSEN.. CHE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ttzuche"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ttzuche")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/ttzuche.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/ttzuche.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ttzuche&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3Attzuche"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TSEN..U EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tzuennn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tzuennn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/tzuennn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/tzuennn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tzuennn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3Atzuennn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-3-unilink"}},[_v("CS2103T-W12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("UniLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-3-unilink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUniversity students\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUniversity students meet people from many different places (e.g. different classes, CCAs, student accommodation, etc). As such, they often have too many contacts that are hard to keep track of. Thus, we hope to make it easier to categorise and find contacts when they need them.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1aNFfc9-PAKCXNOm1KXwOFXF2136rAl1JHg1Prx5V08c/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMEL..LENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/achl1012"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("achl1012")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/achl1012.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/achl1012.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=achl1012&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Aachl1012"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG ..N XU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zienxu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zienxu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/zienxu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/zienxu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zienxu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Azienxu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JERE..N AN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jtooya"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jtooya")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/jtooya.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/jtooya.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jtooya&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Ajtooya"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..U QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kimberlytmq"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kimberlytmq")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/kimberlytmq.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/kimberlytmq.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kimberlytmq&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Akimberlytmq"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAP ..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SlothyCat"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SlothyCat")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/slothycat.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/slothycat.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slothycat&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3ASlothyCat"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-4-talenthub"}},[_v("CS2103T-W12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TalentHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-4-talenthub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCelebrity talent managers who prefer CLI over GUI and have a lot of clients to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe address book offers celebrity managers a secure, offline tool to manage various contacts and stakeholders, track VIP relationships, and schedule events efficiently. With a customizable field, it streamlines coordination while ensuring privacy and data control in a high-stakes environment.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1AJNKqSXt7Dsx_jpFpfZm6jtwSned0_g6lr_fDoIBmxQ/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HARI..RFAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Haris-Irfan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Haris-Irfan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/haris-irfan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/haris-irfan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=haris-irfan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3AHaris-Irfan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HENG.. SIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/fusin02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("fusin02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/fusin02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/fusin02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fusin02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Afusin02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QIU ..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jhqiu21"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jhqiu21")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/jhqiu21.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/jhqiu21.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jhqiu21&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Ajhqiu21"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..THAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seantham21"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seantham21")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/seantham21.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/seantham21.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seantham21&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Aseantham21"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..IJIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wrjgold"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wrjgold")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/wrjgold.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/wrjgold.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wrjgold&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Awrjgold"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w13"}},[_v("CS2103T-W13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-1-cher"}},[_v("CS2103T-W13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Cher]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-1-cher","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrivate school teachers, educators.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nValue Proposition: Simplifies contact management by providing an all-in-one user-friendly interface for teachers or educators in education institutions. Ease their pain of manually tracking things like attendance and parents/students’ contact.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1WC9jrIkqofsdF-KovNYC6hTZz7aeBJ-hUH7U7p31LDU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HALE..RFAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/haleemairfan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("haleemairfan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/haleemairfan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/haleemairfan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=haleemairfan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Ahaleemairfan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI Y..UEYI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yyueyii"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yyueyii")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/yyueyii.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/yyueyii.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yyueyii&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Ayyueyii"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PAIN..KYAW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MinkhantEain"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MinkhantEain")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/minkhanteain.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/minkhanteain.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=minkhanteain&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3AMinkhantEain"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VARA..HUNA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/miuna9890"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("miuna9890")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/miuna9890.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/miuna9890.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=miuna9890&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Amiuna9890"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHOU..NGYE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zhou-colla"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zhou-colla")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/zhou-colla.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/zhou-colla.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zhou-colla&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Azhou-colla"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-2-careconnect"}},[_v("CS2103T-W13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CareConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-2-careconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nBusy social workers providing community case management services at local social service agencies. Their role involves the need to keep track of, and follow up with multiple assigned clients, each with varying needs and requirements.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA CLI-first case management application that enables social workers to efficiently manage client details, appointments, and priorities. Repeated chores including data entry and search will be streamlined via simple CLI inputs, easing the mental load of the social workers, allowing them to focus more on delivering high-quality care and support.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1lho7NQmFLiS3lKv8If6wzyVpNCIvDIqQeO6m2wC3BAY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAI..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/celeschai"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("celeschai")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/celeschai.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/celeschai.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=celeschai&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3Aceleschai"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUHA..LOYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SuhailLoya"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SuhailLoya")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/suhailloya.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/suhailloya.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=suhailloya&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3ASuhailLoya"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mongj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mongj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/mongj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/mongj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mongj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3Amongj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN.. JEM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AppleJem"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AppleJem")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/applejem.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/applejem.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=applejem&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3AAppleJem"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-3-mindmap"}},[_v("CS2103T-W13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MindMap]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-3-mindmap","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPsychologists and Psychiatrists who rely on their computers for managing patient records, session notes, and administrative tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvides an efficient way for psychologists and psychiatrists to log patient information and session details with minimal disruption. The CLI-based approach prioritizes quick data entry and organization while maintaining privacy by storing data locally, addressing the need for secure, fuss-free patient record management during sessions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/127pClz2cUOx_6aXMIsdt14z5zXBOHv7rwqu6CLt82TY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zhiyi12345"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zhiyi12345")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/zhiyi12345.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/zhiyi12345.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zhiyi12345&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Azhiyi12345"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LER ..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/junyi73"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("junyi73")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/junyi73.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/junyi73.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=junyi73&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Ajunyi73"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Z.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/slidings"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("slidings")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/slidings.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/slidings.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slidings&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Aslidings"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jeanyang04"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jeanyang04")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/jeanyang04.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/jeanyang04.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jeanyang04&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Ajeanyang04"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH ..HUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/t-leongchuan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("t-leongchuan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/t-leongchuan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/t-leongchuan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=t-leongchuan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3At-leongchuan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-4-knottyplanners"}},[_v("CS2103T-W13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("KnottyPlanners]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-4-knottyplanners","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWedding planner who types fast and prefers using a command-line interface (CLI) over graphical inputs. They handle contact management, event coordination, and logistics.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWe solve the problem of slow and inefficient contact management and event coordination for wedding planners. By providing fast access to client and vendor details, it is optimised for planners who need to search through a large stack of contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ceSmpUGD0e9zGZM8S7yu-yn6NZCOZu7HYOVJrQYUIYw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("IZZA..SHAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ywllowsensor"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ywllowsensor")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/ywllowsensor.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/ywllowsensor.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ywllowsensor&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Aywllowsensor"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JONU.. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jonushzw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jonushzw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/jonushzw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/jonushzw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jonushzw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Ajonushzw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI S..IRUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/siriousguy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("siriousguy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/siriousguy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/siriousguy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=siriousguy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Asiriousguy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YASW..LURI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yastsc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yastsc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/yastsc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/yastsc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yastsc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Ayastsc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHOU..ZIBO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zzibo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zzibo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/zzibo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/zzibo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zzibo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Azzibo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w14"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w14"}},[_v("CS2103T-W14"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-1-vendorvault"}},[_v("CS2103T-W14-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("VendorVault]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-1-vendorvault","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for grocers who have to interact and confirm orders with multiple suppliers and customers constantly\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n- Stores can have multiple suppliers, it is difficult to keep track of who to contact for a particular good - Supplier’s contact can be tagged with the level of inventory in the store, allowing grocers to call suppliers quickly when stocks are low - Grocers can also coordinate grocery deliveries to customers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1QB0nUKadPegmiz9kScgPoXHZJx-ffY-KGFqG9bXx6ow/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..NZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/CJianzhi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CJianzhi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/cjianzhi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/cjianzhi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cjianzhi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3ACJianzhi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KART..MAAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/prave1n"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("prave1n")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/prave1n.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/prave1n.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=prave1n&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3Aprave1n"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KRIS..ARUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LinkesV"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LinkesV")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/linkesv.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/linkesv.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=linkesv&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3ALinkesV"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG J..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ngjianyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ngjianyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/ngjianyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/ngjianyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ngjianyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3Angjianyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VINC..YONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/vinc3leong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("vinc3leong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/vinc3leong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/vinc3leong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vinc3leong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3Avinc3leong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-2-ba"}},[_v("CS2103T-W14-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BA€]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-2-ba","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSalespeople that make recurring sales\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nConsolidates information about clients from multiple sources. Provides an overview of all clients and offers options to visualise information about specific client groups, especially those that they need to prioritise to optimise their sales\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Zj4AcaHIi3spj0clSS5UK7yU3gYFMTxw0l8kI4Jfa8A/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ARVI..AJAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DiegoTheExplorar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DiegoTheExplorar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/diegotheexplorar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/diegotheexplorar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=diegotheexplorar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3ADiegoTheExplorar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HAN ..NTIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/valhrd"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("valhrd")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/valhrd.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/valhrd.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=valhrd&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3Avalhrd"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/frymash"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("frymash")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/frymash.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/frymash.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=frymash&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3Afrymash"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RYAN.. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RyanWarwick"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RyanWarwick")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/ryanwarwick.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/ryanwarwick.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ryanwarwick&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3ARyanWarwick"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SNOD..ETER")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/appleshill"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("appleshill")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/appleshill.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/appleshill.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=appleshill&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3Aappleshill"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-3-hall-pointer"}},[_v("CS2103T-W14-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Hall Pointer]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-3-hall-pointer","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCCA Leaders in NUS Hall\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHall Pointer empowers CCA leaders in NUS Halls to efficiently manage member tracking by streamlining participation recording, points allocation, and room addresses. It simplifies manual data management, enabling leaders to focus on organizing activities rather than administrative tasks. Ideal for small, close-knit CCAs, it ensures quick access to updated information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Lb8pp6hqFPvNjbclFUGlxWXDWN37EmqtPC6u5DInjvI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LAI ..NIEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/starchypotatocode"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("starchypotatocode")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/starchypotatocode.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/starchypotatocode.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=starchypotatocode&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Astarchypotatocode"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG ..EITH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/keithxun"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("keithxun")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/keithxun.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/keithxun.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=keithxun&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Akeithxun"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QIN ..CHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/QinHaichen12"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("QinHaichen12")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/qinhaichen12.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/qinhaichen12.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=qinhaichen12&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3AQinHaichen12"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/taggyhan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("taggyhan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/taggyhan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/taggyhan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=taggyhan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Ataggyhan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YUVR..INGH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yuvrajaryan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yuvrajaryan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/yuvrajaryan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/yuvrajaryan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yuvrajaryan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Ayuvrajaryan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-4-eventfulnus"}},[_v("CS2103T-W14-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EventfulNUS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-4-eventfulnus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSports Event (e.g. IFG) Organiser that needs to manage and contact: Audience, Athletes, Committee Members, Referees, Photography. This person prefers CLI over GUI and has many event participants to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAll event organizers will be able to: a) View what kind of participant each contact is in the application is without having to dig through paperwork / NUSync b) View how participants are grouped by membership (e.g. faculty sports team) without having to dig through paperwork / NUSync c) Track the particular participant’s involvement in the event’s sub-events (e.g. IFG has multiple sub-events that stakeholders can take part in) without having to dig through paperwork / NUSync\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1NkW50U7mpYOSGXb_wfhzEDSwrPRHWlvO3Mm7u02xcps/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AARO.. SIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Peanuts359"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Peanuts359")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/peanuts359.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/peanuts359.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=peanuts359&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3APeanuts359"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bryanjhc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bryanjhc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/bryanjhc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/bryanjhc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bryanjhc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Abryanjhc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FAN ..OLIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaoxi998533"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaoxi998533")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/kaoxi998533.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/kaoxi998533.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaoxi998533&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Akaoxi998533"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PARK..GSEO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/youngseopark05"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("youngseopark05")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/youngseopark05.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/youngseopark05.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=youngseopark05&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Ayoungseopark05"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WOLF..ARDO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leowolf275"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leowolf275")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/leowolf275.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/leowolf275.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leowolf275&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Aleowolf275"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t08"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t08"}},[_v("CS2103T-T08"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-1-dltbook"}},[_v("CS2103T-T08-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("DLTbook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-1-dltbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCS students interested in using stablecoins for transactions\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor NUS CS Students who use Crypto for transactions dissatisfied with the hassle of tracking public addresses manually due to high complexity of manually doing so, DLTbook offers a DLT public address tracking platform that aggregates this data\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1-eEmDVd3T_eh3xNhoEUe_RiBDeNu-40B9DFn50pT1tk/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALEX..ANDY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Airiinnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Airiinnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/airiinnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/airiinnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=airiinnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3AAiriinnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON..ZHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chongtzezhao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chongtzezhao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/chongtzezhao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/chongtzezhao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chongtzezhao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3Achongtzezhao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nicholascyx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nicholascyx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/nicholascyx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/nicholascyx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholascyx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3ANicholascyx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIM ..AVIS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/travisim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("travisim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/travisim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/travisim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=travisim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3Atravisim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TheRareFox"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TheRareFox")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/therarefox.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/therarefox.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=therarefox&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3ATheRareFox"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-2-keycontacts"}},[_v("CS2103T-T08-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("KeyContacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-2-keycontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHome piano tutors\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nToo many groups and students to keep track of, including what pieces they are learning, what time their session is, what grade they are currently, whether the class is a theory class or practical class etc.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/12OH5vGb3r7hOeilAjC5u9e9ZIrueOzxD4Homn65me2M/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AUDI..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/audipras"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("audipras")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/audipras.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/audipras.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=audipras&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Aaudipras"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bryancheny"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bryancheny")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/bryancheny.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/bryancheny.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bryancheny&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Abryancheny"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/IzN432"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("IzN432")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/izn432.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/izn432.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=izn432&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3AIzN432"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KIM ..YEOK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zzawook"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zzawook")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/zzawook.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/zzawook.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zzawook&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Azzawook"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..DAVE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dwsc37"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dwsc37")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/dwsc37.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/dwsc37.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dwsc37&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Adwsc37"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-3-meddict"}},[_v("CS2103T-T08-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MedDict]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-3-meddict","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPhysiotherapists\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide a more specialised one-stop-for-all medical related information to physiotherapists' patients, schedules, appointments and to keep track of patients' medical information, progression, medical history etc. Optimized for physiotherapists who may have to keep close track of all their patients’ detailed progress, whilst having to juggle with having many patients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1LZNigqwbME4LP_1AR6YL4q_EGWK5Bmy-BHiCZ4kBco0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AXEL..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shinichi04"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shinichi04")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/shinichi04.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/shinichi04.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shinichi04&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Ashinichi04"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..IHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chengzihao123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chengzihao123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/chengzihao123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/chengzihao123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chengzihao123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Achengzihao123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NIGE.. YOU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nigeltzy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nigeltzy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/nigeltzy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/nigeltzy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nigeltzy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3ANigeltzy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAND..LUYO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sandyk0105"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sandyk0105")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/sandyk0105.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/sandyk0105.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sandyk0105&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Asandyk0105"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THAM..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tyxiangs"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tyxiangs")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/tyxiangs.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/tyxiangs.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tyxiangs&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Atyxiangs"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-4-tahub"}},[_v("CS2103T-T08-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-4-tahub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching assistants in university-level courses managing students contacts\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAHub simplifies the management of student information, providing organized data management for teaching assistants who need efficient, accurate tools for tracking attendance, grades, and participation.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1F-tIBE-hXjc3OpZ8GIvhpLu0XOq91lKnxewlOySBKY0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALBE..UTRA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hpcman"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hpcman")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/hpcman.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/hpcman.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hpcman&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Ahpcman"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DOMI.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dominopizzaaaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dominopizzaaaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/dominopizzaaaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/dominopizzaaaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dominopizzaaaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Adominopizzaaaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUAN..IERI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/juancarlovieri"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("juancarlovieri")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/juancarlovieri.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/juancarlovieri.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=juancarlovieri&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Ajuancarlovieri"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAFA..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/izruff"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("izruff")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/izruff.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/izruff.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=izruff&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Aizruff"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RIVE.. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Oceankoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Oceankoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/oceankoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/oceankoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=oceankoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3AOceankoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t09"}},[_v("CS2103T-T09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-1-internbuddy"}},[_v("CS2103T-T09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("InternBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-1-internbuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for university students majoring in Computer Science, specifically those seeking summer internships. They are typically busy with assignments while applying for summer internships. As a result, they may lose track of key information about companies they have applied for in a constantly increasing list of applications made.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInternBuddy aims to simplify and efficiently manage internship application details, optimised for fast typers who prefer a CLI interface. It enables users to track key information such as HR contacts, interview dates, and application statuses, all while maintaining portability across multiple operating systems without requiring a remote server.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/18DnZEyYiCFxt_Ajr6h_bGZwW8NYn5JeZz8Yt1XOGvDw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG .. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/realqijun"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("realqijun")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/realqijun.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/realqijun.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=realqijun&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Arealqijun"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOH ..ESON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/blanklogic"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("blanklogic")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/blanklogic.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/blanklogic.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=blanklogic&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Ablanklogic"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..RWIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/meerkatboy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("meerkatboy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/meerkatboy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/meerkatboy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=meerkatboy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Ameerkatboy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TONG..IMON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/uniqly"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("uniqly")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/uniqly.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/uniqly.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=uniqly&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Auniqly"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VARU..UKLA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Shux347"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Shux347")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/shux347.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/shux347.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shux347&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3AShux347"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-2-talentsg"}},[_v("CS2103T-T09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TalentSG]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-2-talentsg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur primary target users are Recruiters and HR professionals who are responsible for managing job candidates and employee information. These users typically work in fast-paced environments where efficient management of candidate and employee data is crucial for streamlining the recruitment process and ensuring organisational growth.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTalentSG aims to simplify and enhance the recruitment process for HR professionals and recruiters. The application will provide robust features for tracking applicants, managing interview schedules, and maintaining comprehensive records of employment details. By centralising these tasks in one intuitive platform, TalentSG will help users to make better hiring decisions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1701xNBt2jjcBjT-n1O5RbFzOO3rtK9tOxmZWL6rYgW4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH..ITYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thisisaditya17"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thisisaditya17")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/thisisaditya17.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/thisisaditya17.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thisisaditya17&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Athisisaditya17"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEI ..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dominic2412"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dominic2412")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/dominic2412.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/dominic2412.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dominic2412&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Adominic2412"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SARA..HANI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rithanisk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rithanisk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/rithanisk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/rithanisk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rithanisk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Arithanisk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TANG..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/stanleytangzh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("stanleytangzh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/stanleytangzh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/stanleytangzh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=stanleytangzh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Astanleytangzh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TUNG.. ZUO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Darren-Tung"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Darren-Tung")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/darren-tung.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/darren-tung.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=darren-tung&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3ADarren-Tung"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-3-medicontacts"}},[_v("CS2103T-T09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MediContacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-3-medicontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for receptionists at a private clinic who prefer CLI over GUI and have to deal with numerous patients' records and staff particulars while being visually organised.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables users to efficiently keep track of relevant personnel in the clinic (patients, referring doctors, suppliers, and other healthcare providers), arrange appointments between relevant parties, and analyse and group various information from the patients' records.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/11QvqzXhNOlaU52bmu35PEtUVE9rx0z3DtIwvzwefhkU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BRAN..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MiloTruck"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MiloTruck")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/milotruck.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/milotruck.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=milotruck&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3AMiloTruck"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chiangqinkang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chiangqinkang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/chiangqinkang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/chiangqinkang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chiangqinkang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Achiangqinkang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MA C..RIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bmanara"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bmanara")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/bmanara.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/bmanara.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bmanara&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Abmanara"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU.. LEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sam-theman88"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sam-theman88")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/sam-theman88.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/sam-theman88.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sam-theman88&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Asam-theman88"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THNG..ANIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/taniathng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("taniathng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/taniathng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/taniathng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=taniathng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Ataniathng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-4-goats-greatest-online-address-book-for-tutoring-students"}},[_v("CS2103T-T09-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("GOATS - Greatest Online Address-book for Tutoring Students]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-4-goats-greatest-online-address-book-for-tutoring-students","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrivate tutors, who may have students studying at different levels.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTutors find it challenging to keep track of student information if they are teaching multiple students. They could be juggling additional administrative duties with their teaching duties. GOATS can enhance their efficiency by managing student and parent data, freeing up their time and allowing them to focus on other tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/16EoNCO_IdY5ja4ZzoW2JvI1XcHMrLokmLKfw34qQuiI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..CHIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ckclion"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ckclion")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/ckclion.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/ckclion.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ckclion&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3Ackclion"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DING..I HE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/oneBoz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("oneBoz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/oneboz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/oneboz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=oneboz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3AoneBoz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/IsaacPangTH"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("IsaacPangTH")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/isaacpangth.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/isaacpangth.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=isaacpangth&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3AIsaacPangTH"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LUTF..IZAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lutfir-cpu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lutfir-cpu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/lutfir-cpu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/lutfir-cpu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lutfir-cpu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3Alutfir-cpu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TANG..LIOT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/elliot-tang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("elliot-tang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/elliot-tang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/elliot-tang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=elliot-tang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3Aelliot-tang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t10"}},[_v("CS2103T-T10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-1-medicontact"}},[_v("CS2103T-T10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MediContact]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-1-medicontact","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAdministrative staff at a GP clinic responsible for patient management. They should be apt with technology and trained to be familiar with the software as their primary job.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPatient / Contact management systems might be outdated in GP clinics, introducing MediContact might improve user-friendliness. MediContact also centralizes the details of patients at the clinic with a command line interface to enable efficient contact between patient and clinic. Furthermore, it can provide easy categorisation and filtering of patients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1_XXT8HknGxYRj-kGVicz_oyMwtfKL16cxcdSxwQmNN0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AGAR..ITVI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ritvi12"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ritvi12")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/ritvi12.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/ritvi12.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ritvi12&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3Aritvi12"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KELL..A QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Bonzzz3"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bonzzz3")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/bonzzz3.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/bonzzz3.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bonzzz3&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3ABonzzz3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LYNE..YING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LynetteLeeSiYing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LynetteLeeSiYing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/lynetteleesiying.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/lynetteleesiying.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lynetteleesiying&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3ALynetteLeeSiYing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NASY..JAYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/myrilla12"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("myrilla12")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/myrilla12.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/myrilla12.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=myrilla12&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3Amyrilla12"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..OTTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/OttoTan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("OttoTan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/ottotan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/ottotan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ottotan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3AOttoTan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-2-staffsync"}},[_v("CS2103T-T10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("StaffSync]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-2-staffsync","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for Human Resources (HR) Managers that have a lot of potential candidates with a set of skills looking for a spot in their company.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product will provide fast access to potential candidates details, and is able to match candidates with available job openings quickly by looking at their details collected. It will also allow our user to look at a list of updated potential candidates if their contract is over.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/15pEtxfHfaqvuAZcJUX8ER2mpo2idkPDc0nj8ECQhqFs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CAI ..NZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thortol"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thortol")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/thortol.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/thortol.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thortol&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3Athortol"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JEVA..I EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jevan13"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jevan13")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/jevan13.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/jevan13.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jevan13&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3Ajevan13"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..NEST")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LimErnest"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LimErnest")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/limernest.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/limernest.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limernest&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3ALimErnest"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NEO .. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KiKuasaurus"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KiKuasaurus")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/kikuasaurus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/kikuasaurus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kikuasaurus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3AKiKuasaurus"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("POH ..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/InfinityTwo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("InfinityTwo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/infinitytwo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/infinitytwo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=infinitytwo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3AInfinityTwo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-3-tasync"}},[_v("CS2103T-T10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TASync]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-3-tasync","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNus CS TAs who are adept and prefer CLI over GUI, and have to keep track of their tutorial students’ contact and progress.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOffers a streamlined tool for TAs to efficiently manage student contacts and work progress, optimized for users who are fast typers, it’s portable, battery-efficient(light-weight), easy to learn and use.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1WbwSlaBfDzHhQFy-aBEbz-v7sd1BS6tPtSSe8BXh8UE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CLIF..KOES")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Domokunx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Domokunx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/domokunx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/domokunx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=domokunx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3ADomokunx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DARY..BOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DKHB0207"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DKHB0207")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/dkhb0207.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/dkhb0207.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dkhb0207&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3ADKHB0207"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GARE..ARNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/raageth"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("raageth")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/raageth.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/raageth.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=raageth&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3Araageth"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAY ..LENN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sayglenn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sayglenn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/sayglenn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/sayglenn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sayglenn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3Asayglenn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yockcheng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yockcheng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/yockcheng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/yockcheng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yockcheng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3Ayockcheng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-4-legacylink"}},[_v("CS2103T-T10-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("LegacyLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-4-legacylink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for users with big families and has to manage lots of contacts to plan for family events.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nBig family trees are difficult to keep track of. Our product allows users who have big families to keep track of family members, relatives and in-laws’ contacts and update it easily when it changes.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Gdu5kCJ806V9OOP29Siepyo26ImhT_a6kFf5_zJkBRs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ASVE..ASAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ashea10"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ashea10")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/ashea10.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/ashea10.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ashea10&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Aashea10"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GILB..NDAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Gilbb"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gilbb")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/gilbb.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/gilbb.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gilbb&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3AGilbb"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GORA..HANK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shadhankkk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shadhankkk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/shadhankkk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/shadhankkk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shadhankkk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Ashadhankkk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MARC.. LIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/marchjlim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("marchjlim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/marchjlim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/marchjlim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=marchjlim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Amarchjlim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MICH..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/michaelyql"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("michaelyql")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/michaelyql.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/michaelyql.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=michaelyql&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Amichaelyql"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t11"}},[_v("CS2103T-T11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-1-bizbook-pro"}},[_v("CS2103T-T11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BizBook Pro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-1-bizbook-pro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for small business owners juggling multiple contacts across various roles who need an efficient, centralized contact management solution.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStreamline your business relationships with a robust, all-in-one contact management tool that organizes suppliers, customers, and employees while integrating seamlessly with your existing business processes.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1pcOzT2QMCi8shd18wL7oGfZAnMlYe295tp-UEgW-4gQ/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CALE.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/calebchongsj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("calebchongsj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/calebchongsj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/calebchongsj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=calebchongsj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Acalebchongsj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ryenl"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ryenl")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/ryenl.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/ryenl.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ryenl&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Aryenl"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LUCA..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yikyak02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yikyak02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/yikyak02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/yikyak02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yikyak02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Ayikyak02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QIAO..OWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bbryant824"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bbryant824")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/bbryant824.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/bbryant824.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bbryant824&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Abbryant824"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/samuelthen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("samuelthen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/samuelthen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/samuelthen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samuelthen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Asamuelthen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-2-kontacts"}},[_v("CS2103T-T11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("KonTActs]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-2-kontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching Assistants (TA) of CS2030S. TAs of CS2030S are tasked with grading their student’s work on Github through commenting on their commits.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAs of CS2030S manage many students, requiring easy access to GitHub usernames and other contacts, like professors and fellow TAs. Our product simplifies this process by providing a centralized, command-line-friendly tool to store and reference all contacts efficiently, enhancing communication and reducing workload stress.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ww5uQCleo9vz2N9SReypwjn41SDLz7RhzqGSPij0DU0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAVI.. WEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Incogdino"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Incogdino")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/incogdino.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/incogdino.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=incogdino&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3AIncogdino"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LAU ..G YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DesSnowy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DesSnowy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/dessnowy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/dessnowy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dessnowy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3ADesSnowy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SWAM..ISWA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SwaminathanViswa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SwaminathanViswa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/swaminathanviswa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/swaminathanviswa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=swaminathanviswa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3ASwaminathanViswa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEE .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/currynia"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("currynia")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/currynia.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/currynia.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=currynia&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3Acurrynia"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH .. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tohjh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tohjh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/tohjh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/tohjh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tohjh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3Atohjh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-3-bridal-boss"}},[_v("CS2103T-T11-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Bridal Boss]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-3-bridal-boss","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA wedding organiser responsible for planning and managing weddings. They coordinate with vendors, clients (brides, grooms, and their families), and participants (guests, photographers, caterers, etc.). Their work involves juggling multiple tasks and deadlines to ensure that the wedding runs smoothly. CLI for efficient data entry and retrieval.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables users to manage multiple weddings simultaneously, maintaining detailed vendor and client records. It offers fast, efficient access to information, helping the user categorise and update contacts related to each wedding easily. Provides streamlined management of vendor contacts, client preferences, and event timelines.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1qKe-lru-gK0GZNs4_Zb6k_Urf59JuLBB-YZyWoFIUDw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOEY..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jowhee3011"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jowhee3011")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/jowhee3011.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/jowhee3011.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jowhee3011&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3Ajowhee3011"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUN .. YIK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yikjunxian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yikjunxian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/yikjunxian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/yikjunxian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yikjunxian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3Ayikjunxian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIM ..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Droas590"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Droas590")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/droas590.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/droas590.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=droas590&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3ADroas590"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SNG ..NICE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SherniceSng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SherniceSng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/shernicesng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/shernicesng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shernicesng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3ASherniceSng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VED ..OSHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/VedJoshi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("VedJoshi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/vedjoshi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/vedjoshi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vedjoshi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3AVedJoshi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-4-health-connect"}},[_v("CS2103T-T11-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Health Connect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-4-health-connect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHospital Receptionist/ Nurses in Charge of creating duty rosters for the hospital. - Requires accurate, up-to-date and quick access to information\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur patient management system empowers nurses to efficiently retrieve and analyze patient information, enabling them to provide personalized care. By accessing comprehensive patient data, nurses can generate prioritized rosters, ensuring that those requiring the most attention are addressed promptly and effectively. This enhances patient safety, streamlines workflow, and supports nurses.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1_JGRB203WeUrUeFOMsFXAfSX1ma7rgDYD95GtjsX9ks/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ADIT..ANDE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/aditig0305"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("aditig0305")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/aditig0305.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/aditig0305.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=aditig0305&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3Aaditig0305"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AGAR..IDDH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/samriddh2145"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("samriddh2145")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/samriddh2145.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/samriddh2145.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samriddh2145&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3Asamriddh2145"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JASO.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Sornsornah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Sornsornah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/sornsornah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/sornsornah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sornsornah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3ASornsornah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KAKK..IRRA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nihirraa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nihirraa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/nihirraa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/nihirraa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nihirraa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3ANihirraa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NAYA..HESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nayanaamahesh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nayanaamahesh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/nayanaamahesh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/nayanaamahesh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nayanaamahesh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3Anayanaamahesh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t12"}},[_v("CS2103T-T12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-1-eventory"}},[_v("CS2103T-T12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Eventory]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-1-eventory","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEvent Organizers and Planners\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product allows users to - Manage big and complex contact webs with numerous information fields, with ability to save critical details - Schedule and manage daily tasks across large teams, track their completion - Have advanced automated messaging tools, send and schedule reminders/updates in bulk\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Dy4X5ucnySZ-_11-0jbmPbqdnh_zn601m9v4Go14-L4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANTH..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/antgyf"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("antgyf")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/antgyf.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/antgyf.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=antgyf&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3Aantgyf"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAYD..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jayden-Kim-NUS"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jayden-Kim-NUS")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/jayden-kim-nus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/jayden-kim-nus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jayden-kim-nus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3AJayden-Kim-NUS"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOH ..ERAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FriedCabbageSalad"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FriedCabbageSalad")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/friedcabbagesalad.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/friedcabbagesalad.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=friedcabbagesalad&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3AFriedCabbageSalad"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hogretup"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hogretup")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/hogretup.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/hogretup.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hogretup&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3Ahogretup"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU B..OJIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wubojin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wubojin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/wubojin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/wubojin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wubojin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3Awubojin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-2-planperfect"}},[_v("CS2103T-T12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PlanPerfect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-2-planperfect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for wedding planners who prefer CLI over GUI and have many contacts of clients, companies, venues, and more to keep track of. While targeted primarily at wedding planners, it is also suitable for those planning large events.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWedding planners often have to deal with many contacts which can be troublesome. AB3 provides organisational features to keep track of clients, wedding photographers, wedding locations, food caterers, guest lists and other important contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1XsDQyMXyr7DEgCbu-OxPCg4mF4sYuOlXf5KnTst5ST8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DAVI..-YAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kikokidayo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kikokidayo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/kikokidayo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/kikokidayo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kikokidayo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Akikokidayo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GHOS..ITYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/adipanda2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("adipanda2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/adipanda2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/adipanda2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=adipanda2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Aadipanda2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("IGNA.. OEY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ignatiusoey09"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ignatiusoey09")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/ignatiusoey09.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/ignatiusoey09.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ignatiusoey09&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Aignatiusoey09"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KHAN.. RAJ")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yxshrk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yxshrk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/yxshrk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/yxshrk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yxshrk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Ayxshrk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAEG..I EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/maertan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("maertan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/maertan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/maertan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=maertan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Amaertan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-3-logilink"}},[_v("CS2103T-T12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("LogiLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-3-logilink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nLogistic coordinator for logistic companies\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables the company to have an organized way to track all their shipments, plan their deliveries, calculate shipping, etc., as well as an easy and fast way to access information of all their customers and clients\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1mZdY_B3byJfSuaFXDw2TGHh6bET8Qa0LPc80lNieP0k/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALQA..IR A")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Eru111"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Eru111")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/eru111.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/eru111.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=eru111&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3AEru111"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH.. JIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaajinn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaajinn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/kaajinn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/kaajinn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaajinn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3Akaajinn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..ARON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xGladiate"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xGladiate")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/xgladiate.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/xgladiate.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xgladiate&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3AxGladiate"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YANG..MING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hm-yang1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hm-yang1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/hm-yang1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/hm-yang1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hm-yang1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3Ahm-yang1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAO..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/linedoestrolling"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("linedoestrolling")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/linedoestrolling.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/linedoestrolling.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=linedoestrolling&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3Alinedoestrolling"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-4-gamerbook-pro-max"}},[_v("CS2103T-T12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("GamerBook Pro Max]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-4-gamerbook-pro-max","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is designed for gamers who play multiplayer online games and need to keep track of their gaming friends, teammates, and communities.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nGamerBook Pro Max helps users manage contact details of a small group of personal gaming friends, tracking which games they play and their usernames across different platforms.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1OKNbF4TPyH7lCZF2YMcsNbPWMSSiEnwHZl4dGlc5l7Q/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..I YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ChenLeiyu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ChenLeiyu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/chenleiyu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/chenleiyu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chenleiyu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AChenLeiyu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HUAN..NING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Kitty-001"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Kitty-001")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/kitty-001.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/kitty-001.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kitty-001&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AKitty-001"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..THEW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/flyingsalsa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("flyingsalsa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/flyingsalsa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/flyingsalsa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=flyingsalsa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3Aflyingsalsa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JJtan2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JJtan2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/jjtan2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/jjtan2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jjtan2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AJJtan2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHEN..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Xczheng0105"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Xczheng0105")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/xczheng0105.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/xczheng0105.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xczheng0105&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AXczheng0105"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t13"}},[_v("CS2103T-T13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-1-medconnect"}},[_v("CS2103T-T13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MedConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-1-medconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHealthcare administrators\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe app will enable healthcare administrators to consolidate contacts of hospital staff, patients and related information into a single database. Designed for high-pressure environments, it enables speedy lookups and updates, ensuring that providers can quickly connect with the right people, from on-call doctors to patients’ families, when every second counts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1VXTh2Fm6hWq7H8dXw1ksjeMk4TW4mEGKF26JhiUySnM/"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALDE..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/aldentantan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("aldentantan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/aldentantan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/aldentantan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=aldentantan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3Aaldentantan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KELL..QING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kellywsq03"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kellywsq03")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/kellywsq03.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/kellywsq03.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kellywsq03&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3Akellywsq03"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..HAIK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/saajidshaik02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saajidshaik02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/saajidshaik02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/saajidshaik02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=saajidshaik02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3Asaajidshaik02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..JOHN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Johnwz123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Johnwz123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/johnwz123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/johnwz123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=johnwz123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3AJohnwz123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-2-nomnom-notifier"}},[_v("CS2103T-T13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NomNom Notifier]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-2-nomnom-notifier","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nManagers of smaller eateries/restaurants who need to maintain organised customer details for delivery purposes.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n- For restaurants to efficiently manage customer contact information, reducing errors and improving customer service (Reduces miscommunication and thus streamlines operations.) - To bring convenience for customers as they no longer need to repeatedly inform restaurants of their details (Fosters customer loyalty)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1iv-7g49f_GepFHfF41cpID4RBPS8eG2TUNm5G3fxwMs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOEL..RNAV")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/arnav-goel10"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("arnav-goel10")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/arnav-goel10.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/arnav-goel10.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arnav-goel10&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Aarnav-goel10"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rimgik"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rimgik")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/rimgik.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/rimgik.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rimgik&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Arimgik"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Y.. YEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yyanyee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yyanyee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/yyanyee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/yyanyee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yyanyee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Ayyanyee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH ..XING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tohhengxing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tohhengxing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/tohhengxing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/tohhengxing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tohhengxing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Atohhengxing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VINO..ILAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/noth-k"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("noth-k")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/noth-k.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/noth-k.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=noth-k&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Anoth-k"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-3-pawpatrol"}},[_v("CS2103T-T13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PawPatrol]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-3-pawpatrol","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is targeted towards veterinarians who have a high patient inflow. The features should be easy to learn and quick to use, perfect for busy veterinarians who want to better manage their clients' details but may not want to go through a steep learning curve.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAs our product is highly niche, it will offer lots of targeted features to manage client details for veterinarians. It will store data such as check-up and consultation dates, financial information as well as clinical information on their pets. It may also include a reminder and calendar feature.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1haboPcjmvgQqhhY5PHOCvMARODsj2DGcr_g-FHBoewA/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CLAR..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/clarissatjx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("clarissatjx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/clarissatjx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/clarissatjx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=clarissatjx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Aclarissatjx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DAVI.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/davidgohzk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("davidgohzk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/davidgohzk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/davidgohzk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=davidgohzk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Adavidgohzk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JONA..NHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jloh02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jloh02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/jloh02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/jloh02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jloh02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Ajloh02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JORD..CHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/naythee169"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("naythee169")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/naythee169.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/naythee169.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=naythee169&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Anaythee169"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RODR..ARON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Runus01"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Runus01")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/runus01.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/runus01.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=runus01&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3ARunus01"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-4-carelink"}},[_v("CS2103T-T13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CareLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-4-carelink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIndependent Geriatricians managing elderly patients with chronic conditions, someone who can type fast, prefers CLI over GUI, and often needs to manage several patients\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nExisting software don’t fulfil the needs of independent Geriatricians as they are either generic or integrated into hospitals. They can be time-consuming and complicated. We specifically target Geriatricians by tailoring to their requirements of managing elderly patients when it comes to tracking chronic conditions, coordinating care, and maintaining regular follow-ups.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/14cdvVoXnRXXcGMSFvDDkpkL0ICsjlCmsjrMXbf5fWys/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AngPengXuan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AngPengXuan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/angpengxuan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/angpengxuan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=angpengxuan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3AAngPengXuan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GARG..ANYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lavanyagarg112"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lavanyagarg112")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/lavanyagarg112.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/lavanyagarg112.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lavanyagarg112&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3Alavanyagarg112"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRAD..ASAD")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/pradyuprasad"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pradyuprasad")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/pradyuprasad.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/pradyuprasad.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=pradyuprasad&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3Apradyuprasad"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUBR..RISH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Ponharish"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ponharish")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/ponharish.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/ponharish.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ponharish&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3APonharish"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUHA..LEEM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/suhayl13"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("suhayl13")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/suhayl13.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/suhayl13.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=suhayl13&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3Asuhayl13"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t14"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t14"}},[_v("CS2103T-T14"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-1-prudy"}},[_v("CS2103T-T14-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Prudy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-1-prudy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrudential insurance agents who wants to keep track of clients insurance policies (one stop contact book for Financial Advisors to keep track of clients)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWe firstly improve efficiency through easy client management. Agents can quickly retrieve key information such as a client's insurance policies and contacts. Next, also improve client relationships by ensuring agents never miss a client policy renewal.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1tQYEegiwtcKR71e-xlsOQJc8JKkj9MzSyggcsC90rlM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nimastic"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nimastic")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/nimastic.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/nimastic.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nimastic&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3ANimastic"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUST.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Justincjr"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Justincjr")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/justincjr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/justincjr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justincjr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3AJustincjr"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RITH..ENIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rithiklenin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rithiklenin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/rithiklenin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/rithiklenin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rithiklenin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3Arithiklenin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH .. HUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yihuididi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yihuididi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/yihuididi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/yihuididi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yihuididi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3Ayihuididi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..NGKE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ckaayy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ckaayy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/ckaayy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/ckaayy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ckaayy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3Ackaayy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-2-adminus"}},[_v("CS2103T-T14-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AdmiNUS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-2-adminus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInternational students or exchange students joining NUS who are navigating a new environment and need to keep track of important academic, social, and emergency contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHelps international students manage important contacts such as tutors, groupmates, friends, and emergency services in an organised and efficient manner, reducing stress in an unfamiliar environment. Optimised for users who prefer a CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1aFF0eembSWjZtmoQIc1BhzDi9DR1Q2OCGjnEjeIS5Cw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAR..YING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/charlenetcy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("charlenetcy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/charlenetcy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/charlenetcy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=charlenetcy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Acharlenetcy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LERO.. KIT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leroychiu20"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leroychiu20")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/leroychiu20.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/leroychiu20.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leroychiu20&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Aleroychiu20"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/limjeremy496"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("limjeremy496")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/limjeremy496.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/limjeremy496.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limjeremy496&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Alimjeremy496"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAH..A YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JiaYi-Gallium369"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JiaYi-Gallium369")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/jiayi-gallium369.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/jiayi-gallium369.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiayi-gallium369&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3AJiaYi-Gallium369"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIOW..MING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ruiming97"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ruiming97")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/ruiming97.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/ruiming97.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ruiming97&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Aruiming97"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-3-mater"}},[_v("CS2103T-T14-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MATER]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-3-mater","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for car mechanics and is optimized for users who prefer a CLI over GUI. It is meant for fast access to client details\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n1.Provides a quick way for car workshop to consolidate and retrieve client details 2.Easier than pen and paper tracking/sticky notes in a workshop setting, using a work laptop close by 3.More reliable search tool compared to mechanic group chat, for example 4.Allow workshop mechanics to track car history and issues.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/12RRcWVRsM7XEHQ1mes6OfQCJufhUYHGeG8V33L_Xm6k/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CALE..YONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/calebyyy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("calebyyy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/calebyyy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/calebyyy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=calebyyy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3Acalebyyy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HAN ..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xhamyo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xhamyo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/xhamyo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/xhamyo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xhamyo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3Axhamyo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..QUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/limyuquan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("limyuquan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/limyuquan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/limyuquan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limyuquan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3Alimyuquan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MOHA..IRUL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Meowloid"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Meowloid")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/meowloid.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/meowloid.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=meowloid&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3AMeowloid"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..U XI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SeanWong2"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SeanWong2")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/seanwong2.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/seanwong2.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seanwong2&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3ASeanWong2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-4-agentassist"}},[_v("CS2103T-T14-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AgentAssist]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-4-agentassist","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur target audience is a new generation of young, tech-savvy bank call-centre agents who must satisfy clients' queries. They are swift at typing and prefer commands over traditional GUIs, and yet want some form of GUI instead of looking at an ugly, traditional terminal.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product aims to provide sales banking agents with a CLI that provides all necessary client and credit card details at a glance, with an aesthetic but minimalist UI, boosting speed and efficiency for a better average response time when handling customers,\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1NBoceIvh3UV84Boi3eVsGu8D7uDI4E5QeMDHDjoTjvo/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("COLI..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/colinhia"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("colinhia")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/colinhia.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/colinhia.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=colinhia&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3Acolinhia"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FION..QIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FionaQY"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FionaQY")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/fionaqy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/fionaqy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fionaqy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3AFionaQY"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LITC..SORN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/iamdiluxedbutcooler"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("iamdiluxedbutcooler")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/iamdiluxedbutcooler.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/iamdiluxedbutcooler.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=iamdiluxedbutcooler&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3Aiamdiluxedbutcooler"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. YEW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/itsme-zeix"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("itsme-zeix")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/itsme-zeix.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/itsme-zeix.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itsme-zeix&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3Aitsme-zeix"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHEN.. REN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ZShunRen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ZShunRen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/zshunren.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/zshunren.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zshunren&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3AZShunRen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t15"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t15"}},[_v("CS2103T-T15"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-1-truerental"}},[_v("CS2103T-T15-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TrueRental]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-1-truerental","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nLetting agents\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nLetting agents must manage many clients' personal and property information, e.g. contact details, addresses, rent information, rent prices, tenant information, document storage, and automated reminders. There is too much information for letting agents to keep track of. Hence, our enhanced CLI tool can help them address these problems!\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1i69rY-wnMI2xZN7V58xvLIAfpLX_7xwy2S85IlnXxyo/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BRYA.. HOE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bryanckh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bryanckh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/bryanckh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/bryanckh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bryanckh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Abryanckh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOH .. LIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gohsl99"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gohsl99")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/gohsl99.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/gohsl99.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gohsl99&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Agohsl99"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KANG..HARY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zackjh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zackjh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/zackjh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/zackjh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zackjh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Azackjh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NATH..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RobotWizzard"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RobotWizzard")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/robotwizzard.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/robotwizzard.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=robotwizzard&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3ARobotWizzard"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WINS..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/winstonlimjy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("winstonlimjy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/winstonlimjy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/winstonlimjy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=winstonlimjy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Awinstonlimjy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-2-edututu"}},[_v("CS2103T-T15-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduTutu]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-2-edututu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor tuition center administrators with a great number of students, teachers, and parents to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nMiscommunication, missed updates, and disorganized contact lists can disrupt the learning process, leading to confusion about schedules, and affect the overall student experience. Our address book allows administrative professions to keep track of these information, optimized for quickness and efficiency of commands (CLI-based).\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1v0On7-gKXhThqJdzDh-yefbyo89q4qEr0ziV_C1mBHk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HOO ..HING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hooyushing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hooyushing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/hooyushing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/hooyushing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hooyushing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Ahooyushing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KIM ..NHUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/munhuikim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("munhuikim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/munhuikim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/munhuikim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=munhuikim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Amunhuikim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MATT.. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sumomomomomo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sumomomomomo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/sumomomomomo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/sumomomomomo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sumomomomomo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Asumomomomomo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VU H..KIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kienvumrpm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kienvumrpm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/kienvumrpm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/kienvumrpm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kienvumrpm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Akienvumrpm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. HIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/waihin26"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("waihin26")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/waihin26.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/waihin26.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=waihin26&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Awaihin26"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-3-ward-watch"}},[_v("CS2103T-T15-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Ward-Watch]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-3-ward-watch","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nRounding Doctors: Doctors who perform visits to patients in hospital wards ranging from physicians, residents, or medical interns, depending on the hospital setting.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe app streamlines the management of patients by providing hospital doctors with patient information such as ward location, diagnosis, medication dispensed and notes. Ward-Watch also provides the doctor with a timeline of his upcoming scheduled appointments across the day ensuring efficient patient care and reducing the risk of missed visits.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1VWsdOjGaREfIH4-OxCadjsluOpKXejXTgl0jvzpF21g/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/niclammm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("niclammm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/niclammm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/niclammm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=niclammm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Aniclammm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("OH C..ARON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/daronoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("daronoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/daronoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/daronoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=daronoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Adaronoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("POH ..HOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/choonzies"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("choonzies")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/choonzies.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/choonzies.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=choonzies&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Achoonzies"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHUC..RRYL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shuckycheese"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shuckycheese")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/shuckycheese.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/shuckycheese.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shuckycheese&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Ashuckycheese"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..ENCE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/clarud"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("clarud")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/clarud.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/clarud.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=clarud&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Aclarud"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-4-hrconnect"}},[_v("CS2103T-T15-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HRConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-4-hrconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHR professionals in a tech company\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIt provides fast access to employee, contractor, and candidate contact details, optimized for HR professionals who prefer a CLI. It allows quick updates, talent pool organization, and candidate tracking, all through a streamlined, command-based interface designed for speed and efficiency. It also helps with assignment of HR staff to HR events and cases.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1uYDLHgG98IgLWoQaIjvtHl29D1PBn9bhKCln44LAw14/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DO G..HIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mrnobody0505"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mrnobody0505")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/mrnobody0505.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/mrnobody0505.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mrnobody0505&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3Amrnobody0505"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GAN ..YICK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ItsMeNengYi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ItsMeNengYi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/itsmenengyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/itsmenengyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itsmenengyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3AItsMeNengYi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH.. KIT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Professional-Procrastinat0r"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Professional-Procrastinat0r")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/professional-procrastinat0r.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/professional-procrastinat0r.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=professional-procrastinat0r&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3AProfessional-Procrastinat0r"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE .. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LeeZeHao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LeeZeHao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/leezehao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/leezehao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leezehao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3ALeeZeHao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU..ENZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SamuelFoo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SamuelFoo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/samuelfoo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/samuelfoo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samuelfoo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3ASamuelFoo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t16"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t16"}},[_v("CS2103T-T16"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-1-hrhelper"}},[_v("CS2103T-T16-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HRHelper]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-1-hrhelper","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCompanies’ HR trying to keep track of their employees’ data and wants a fuss-free GUI\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOptimised for fast typers instead of being slowed down by GUI. Better filtration of date that updates real time.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1uffweuProz7tL5Leic24e_aBvmcfInxbYkIstBphFGs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JALE..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jalenleeruixian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jalenleeruixian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/jalenleeruixian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/jalenleeruixian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jalenleeruixian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3AJalenleeruixian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. ZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/W3iZhi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("W3iZhi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/w3izhi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/w3izhi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=w3izhi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3AW3iZhi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU J..NHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/WuJinhan1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("WuJinhan1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/wujinhan1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/wujinhan1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wujinhan1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3AWuJinhan1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAO ..EJUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/testing1234567891011121314"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("testing1234567891011121314")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/testing1234567891011121314.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/testing1234567891011121314.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=testing1234567891011121314&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3Atesting1234567891011121314"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAO ..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/publicmain"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("publicmain")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/publicmain.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/publicmain.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=publicmain&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3Apublicmain"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-2-clientgrid"}},[_v("CS2103T-T16-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClientGrid.]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-2-clientgrid","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal estate agents who want to monitor the buying and selling of properties.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nClientGrid is a address book designed for real estate agents to efficiently manage client contacts, including buyers and sellers. It provides a streamlined way to organize client data and monitor the buying or selling process while maintaining core address book functionality.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1iyn4FZ99_RKB3DTJAjX2xmGztedWjc9ZZerx0YFfkjw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANTH..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thony-ui"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thony-ui")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/thony-ui.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/thony-ui.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thony-ui&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Athony-ui"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HRIS..NDAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Virusrwj223"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Virusrwj223")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/virusrwj223.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/virusrwj223.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=virusrwj223&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3AVirusrwj223"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/apollo-tan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("apollo-tan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/apollo-tan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/apollo-tan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=apollo-tan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Aapollo-tan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WEE .. LIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jolwnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jolwnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/jolwnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/jolwnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jolwnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Ajolwnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YONG.. HOU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yongkheehou"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yongkheehou")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/yongkheehou.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/yongkheehou.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yongkheehou&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Ayongkheehou"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-3-contactsforgood-cfg"}},[_v("CS2103T-T16-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ContactsForGood (CFG)]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-3-contactsforgood-cfg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAdministrators of small scale NGOs\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nContactsForGood helps NGO administrators efficiently manage donors, volunteers, and partners by organising contacts, tracking engagement, and setting follow-up reminders. With its typing-focused interface and offline, editable data, CFG hopes to streamline contact management, allowing administrators to focus on outreach and mission-critical tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ww9NezH6QkTyddvM5fsnseuD3H5Y6BYKJHXGGN6nBI8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. SUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chongsun2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chongsun2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/chongsun2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/chongsun2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chongsun2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Achongsun2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUST..CHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Justin-Yeo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Justin-Yeo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/justin-yeo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/justin-yeo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justin-yeo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3AJustin-Yeo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOU ..NZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zzzlou"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zzzlou")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/zzzlou.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/zzzlou.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zzzlou&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Azzzlou"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAH..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seah-minlong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seah-minlong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/seah-minlong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/seah-minlong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seah-minlong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Aseah-minlong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("XAN ..N NG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/voldiemort"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("voldiemort")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/voldiemort.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/voldiemort.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=voldiemort&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Avoldiemort"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-4-teletutors"}},[_v("CS2103T-T16-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TeleTutors]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-4-teletutors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTutors / Tuition centers managing students / parents\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEasier management of administrative tasks Easier for users who are more proficient at CLI-interfaces Separate work and personal tasks and messages.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1sp67pXGYO8AjFKAXgX8hE1yJ0R90Pd-P1euGl-YYfrs/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON..NSEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Ansel-Ch"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ansel-Ch")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/ansel-ch.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/ansel-ch.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ansel-ch&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3AAnsel-Ch"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..RELL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jerrelllee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jerrelllee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/jerrelllee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/jerrelllee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jerrelllee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3Ajerrelllee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NATH..PING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/natlv"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("natlv")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/natlv.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/natlv.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=natlv&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3Anatlv"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOON..HUGH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gnoossk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gnoossk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/gnoossk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/gnoossk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gnoossk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3Agnoossk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..KEAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Edsel-Tan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Edsel-Tan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/edsel-tan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/edsel-tan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=edsel-tan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3AEdsel-Tan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t17"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t17"}},[_v("CS2103T-T17"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-1-universe"}},[_v("CS2103T-T17-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("UniVerse]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-1-universe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for university students who want to make friends and grow their professional networks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product allows university students to easily access and manage their professional networks, interests, and academic backgrounds.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1HEqU6DAOUiPmxz6tga57VoEyltfCyQiUpGZpJukq81c/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..N LE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chenle228"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chenle228")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/chenle228.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/chenle228.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chenle228&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Achenle228"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..REMY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jeremychiaaaaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jeremychiaaaaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/jeremychiaaaaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/jeremychiaaaaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jeremychiaaaaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Ajeremychiaaaaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOH ..VERA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/verakohh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("verakohh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/verakohh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/verakohh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=verakohh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Averakohh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KUIK..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kuiktzecheng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kuiktzecheng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/kuiktzecheng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/kuiktzecheng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kuiktzecheng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Akuiktzecheng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MALH..RNAV")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/arnav12344"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("arnav12344")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/arnav12344.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/arnav12344.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arnav12344&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Aarnav12344"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-2-servicetrack"}},[_v("CS2103T-T17-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ServiceTrack]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-2-servicetrack","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCustomer Service Representatives who engage with customers on a daily basis.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide convenient access to customer profiles, details, and service history, enhancing operational efficiency and enabling personalized customer interaction, leading to improved customer satisfaction.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/16dNVk-aSSQSUiGqHW5Bj7H-d9ZgLeXX2k3Wz907rHRo/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ENG .. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/engyuhan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("engyuhan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/engyuhan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/engyuhan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=engyuhan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3Aengyuhan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HU H.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/muller317"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("muller317")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/muller317.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/muller317.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=muller317&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3Amuller317"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LU R..JIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RuijianLu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RuijianLu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/ruijianlu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/ruijianlu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ruijianlu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3ARuijianLu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PARK..OUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Judy1x4"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Judy1x4")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/judy1x4.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/judy1x4.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=judy1x4&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3AJudy1x4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..RIEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/1st2GetThisName"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1st2GetThisName")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/1st2getthisname.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/1st2getthisname.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=1st2getthisname&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3A1st2GetThisName"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-3-inventrack"}},[_v("CS2103T-T17-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("InvenTrack]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-3-inventrack","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInventory managers at 7-Eleven convenience stores. They regularly communicate with suppliers and prefer a fast, efficient typing interface over mouse or voice commands.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInvenTrack enables inventory managers to efficiently manage multiple supplier contact information and streamline communication, ensuring smooth operations and minimizing errors in stock replenishment, all through a typing-optimized interface.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1BIh0Z41bUoHxti-b52m2GUxvHyxqp_okqBLq4rHaTJ8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI Y..TONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yu7ong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yu7ong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/yu7ong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/yu7ong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yu7ong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3Ayu7ong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRAV..VITA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Anvita2110"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Anvita2110")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/anvita2110.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/anvita2110.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=anvita2110&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3AAnvita2110"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SING..UMAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ritulkrsingh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ritulkrsingh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/ritulkrsingh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/ritulkrsingh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ritulkrsingh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3Aritulkrsingh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("UDIT..NGHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/T1duS"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("T1duS")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/t1dus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/t1dus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=t1dus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3AT1duS"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("XIE ..NGZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zacharyxzz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zacharyxzz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/zacharyxzz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/zacharyxzz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zacharyxzz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3Azacharyxzz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-4-salescontactpro"}},[_v("CS2103T-T17-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SalesContactPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-4-salescontactpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is specifically for sales representatives who prefer CLI over GUI to manage their contacts and interactions with clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product streamlines contact management, enhances productivity, and optimizes the sales process through rapid data entry and retrieval. This is suitable for high-volume, rapid-paced sales environments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1OWEKv-tXqB6Hzp-x9olQho4s3OHfRDHwLDbXMt2kges/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MANA.. BAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LOLIPOP-INTELLIGENCE"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LOLIPOP-INTELLIGENCE")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/lolipop-intelligence.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/lolipop-intelligence.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lolipop-intelligence&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3ALOLIPOP-INTELLIGENCE"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOO .. TAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sooyitao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sooyitao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/sooyitao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/sooyitao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sooyitao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3Asooyitao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TYAG..ARVA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ty4g1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ty4g1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/ty4g1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/ty4g1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ty4g1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3Aty4g1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEO ..ORGE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/george-yeo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("george-yeo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/george-yeo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/george-yeo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=george-yeo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3Ageorge-yeo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f08"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f08"}},[_v("CS2103T-F08"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-1-voluntier"}},[_v("CS2103T-F08-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("VolunTier]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-1-voluntier","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for supervisors in volunteering organisations who have to manage lots of volunteers under them and have to easily access information regarding these volunteers.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWe notice people working in voluntary organisations tend not to have proper resources to manage large amounts of volunteers in the organisation along with their associated data and projects, so this address book serves to address this issue by providing a structured way to store and access volunteer data easily.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1X6DpsMsJywuO7qDL7td49iq0NGNEqFolllisyfnlkuY/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("IVAN..U EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kohkakohla"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kohkakohla")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/kohkakohla.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/kohkakohla.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kohkakohla&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3Akohkakohla"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI M..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mingyang143"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mingyang143")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/mingyang143.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/mingyang143.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mingyang143&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3Amingyang143"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..ELLE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/estellelim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("estellelim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/estellelim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/estellelim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=estellelim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3Aestellelim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIAH..EVAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jollybomber"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jollybomber")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/jollybomber.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/jollybomber.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jollybomber&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3AJollybomber"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAO ..COLN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Plishh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Plishh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/plishh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/plishh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=plishh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3APlishh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-2-researchroster"}},[_v("CS2103T-F08-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ResearchRoster]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-2-researchroster","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nResearchRoster is for researchers who are managing a large number of study participants and need an easy way to contact different experimental groups. It provides quick access to study participants’ information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAs researchers have to handle large groups of participants across multiple studies, ResearchRoster allows them to have all participants consolidated in a single program. It is optimized to consolidate a list of contact details based on specific experimental criteria, and export it to an easy-to-read format for better data organization.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1aLvEOMUXmcZzwrACewvZBCcX4b-1U4IEw8-bXqCv8iM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DHAR..HWIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sannie-beep"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sannie-beep")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/sannie-beep.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/sannie-beep.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sannie-beep&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Asannie-beep"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG K..HIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/k-hian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("k-hian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/k-hian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/k-hian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=k-hian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Ak-hian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRIS..KASH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/PrishaVP"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PrishaVP")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/prishavp.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/prishavp.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=prishavp&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3APrishaVP"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wkxcass"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wkxcass")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/wkxcass.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/wkxcass.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wkxcass&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Awkxcass"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU J..AWEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wujiaweijoanna"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wujiaweijoanna")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/wujiaweijoanna.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/wujiaweijoanna.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wujiaweijoanna&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Awujiaweijoanna"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-3-findingbrudders"}},[_v("CS2103T-F08-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("FindingbrUdders]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-3-findingbrudders","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nComputing students from NUS (and by extension, possibly every other university that offers computing-related studies) who enjoys meeting new kinds of people.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHas CS become too stressful? Tired of connecting through Talent Connect, LinkedIn, or even NUSConfessIT? Want to form a more personal relationship full of genuine human touch? Let's make finding benefactors, dependable colleagues, and insightful mentors easier for you!\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1PGoRzGKE3dGOaHMaownxuHjPEaKImKB4WEXdRqSBWK4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIN ..INER")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/XinghuaJulia"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XinghuaJulia")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/xinghuajulia.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/xinghuajulia.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xinghuajulia&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3AXinghuaJulia"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("P SH..ARAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/psh12320"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("psh12320")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/psh12320.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/psh12320.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=psh12320&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3Apsh12320"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PETE..JAYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/PeterHW963"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PeterHW963")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/peterhw963.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/peterhw963.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=peterhw963&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3APeterHW963"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SANK..NIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/marraknas"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("marraknas")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/marraknas.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/marraknas.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=marraknas&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3Amarraknas"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ULRI..ANDO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ulricolo7"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ulricolo7")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/ulricolo7.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/ulricolo7.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ulricolo7&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3Aulricolo7"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-4-netbook"}},[_v("CS2103T-F08-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NetBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-4-netbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSoC students who socialise often and looking for internships\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAllows SoC students to quickly and easily manage the relationships they form with others in school and on their journey to acquire internships. SoC students are likely to prefer a CLI due to their background in computing. SoC students can most likely type fast.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Vr1wZfBfklEStheRZgSa6OBC2zG0Jooi9HtBBNz2XWU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEA.. IAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/IanCheah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("IanCheah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/iancheah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/iancheah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=iancheah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3AIanCheah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIU ..INZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/YINZE66"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YINZE66")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/yinze66.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/yinze66.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yinze66&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3AYINZE66"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NIGE..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nigellqx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nigellqx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/nigellqx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/nigellqx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nigellqx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3Anigellqx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG ..RREN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/O-Darren"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("O-Darren")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/o-darren.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/o-darren.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=o-darren&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3AO-Darren"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SPAR..UMAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/justsparsh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("justsparsh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/justsparsh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/justsparsh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justsparsh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3Ajustsparsh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f09"}},[_v("CS2103T-F09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-1-clubconnect"}},[_v("CS2103T-F09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClubConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-1-clubconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nComputing Club Committee Computing Club Committee members are tech-savvy leaders who organize events, manage activities, and foster community engagement. They connect members, sponsors, and industry partners, driving innovation and learning.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStreamline computing club's communication and organization with our address book app. Effortlessly manage member details, sponsor contacts, and event participants in one place. Enhance collaboration, boost engagement, and ensure seamless planning, all while saving time and reducing administrative hassle.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1xTj4pvGG059O44UBxdJ5lqIV0dIofXJAGZIIjcrHa0Y/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/G-Y-Chan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("G-Y-Chan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/g-y-chan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/g-y-chan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=g-y-chan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3AG-Y-Chan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..JIE)")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NicholasCWK"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NicholasCWK")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/nicholascwk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/nicholascwk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholascwk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3ANicholasCWK"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI H..IXIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LiHaixin000"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LiHaixin000")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/lihaixin000.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/lihaixin000.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lihaixin000&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3ALiHaixin000"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/limyixiang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("limyixiang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/limyixiang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/limyixiang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limyixiang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3Alimyixiang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH.. LUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nicholaskoh1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nicholaskoh1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/nicholaskoh1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/nicholaskoh1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholaskoh1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3ANicholaskoh1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-2-planpal"}},[_v("CS2103T-F09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PlanPal]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-2-planpal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for student event planners at NUS who need to manage contacts like attendees, volunteers, sponsors, and vendors for their events.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor student planners who need a seamless way to manage contacts, our address book provides a centralized platform to organize, track, and access the contact information and details of attendees, vendors, sponsors and volunteers, thus enabling effortless coordination of logistics and ensures smooth communication for every event.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/11IzBzNx5GsvHm568-AZ52EKrvZ8d248ftqZCLIZ-2go/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BRIA.. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/brianchoon"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("brianchoon")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/brianchoon.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/brianchoon.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=brianchoon&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Abrianchoon"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/cshao02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cshao02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/cshao02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/cshao02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cshao02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Acshao02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chuajunyu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chuajunyu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/chuajunyu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/chuajunyu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chuajunyu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Achuajunyu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DHRU..ARMA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shardhrv"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shardhrv")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/shardhrv.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/shardhrv.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shardhrv&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Ashardhrv"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THEN.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jan-kai1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jan-kai1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/jan-kai1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/jan-kai1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jan-kai1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Ajan-kai1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-3-bridalbuddy"}},[_v("CS2103T-F09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BridalBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-3-bridalbuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for wedding planners who type quickly and prefer command-line interfaces over graphical user interfaces, needing to efficiently manage details about different stakeholders for each wedding, including family members, attendees, helpers, photographers, caterers and florists.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide wedding planners with a streamlined, all-in-one wedding planning tool that simplifies the usually time-intensive and tedious tasks of managing guest lists, schedules, and vendor contacts. By offering intuitive organisation and customisation, the app ensures a stress-free and efficient planning process, serving as a one-stop companion for wedding planners.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1zs_EfK19jkKojZqxOAvW6RlySXBxonu8IoFxCdB37iM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HOVA.. MAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hovanleong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hovanleong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/hovanleong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/hovanleong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hovanleong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Ahovanleong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. BIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weibinlim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weibinlim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/weibinlim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/weibinlim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weibinlim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Aweibinlim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU..G EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/slye20"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("slye20")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/slye20.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/slye20.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slye20&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Aslye20"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yxtan02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yxtan02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/yxtan02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/yxtan02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yxtan02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Ayxtan02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YANG..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/YangQF2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YangQF2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/yangqf2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/yangqf2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yangqf2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3AYangQF2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-4-tuteez"}},[_v("CS2103T-F09-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("tuteez]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-4-tuteez","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTech Savvy full-time private tutors who exclusively teach 1-1 lessons (no group lessons) on a regular weekly schedule.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur app serves as an address book tailored for tech-savvy full-time tuition teachers who prefer to use CLI, streamlining the management of student schedules and contact details. It effectively prevents scheduling conflicts and allows for quick access to essential information, enabling teachers to prioritise teaching over administration.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1fhMcHoQjPFKYh-oNHDdoLp1Z8gX59T4lWQYmzJ8qa_M/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..LENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/luileng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("luileng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/luileng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/luileng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=luileng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Aluileng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CURT..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/curtischang2510"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("curtischang2510")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/curtischang2510.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/curtischang2510.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=curtischang2510&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Acurtischang2510"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QUAH..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaikquah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaikquah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/kaikquah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/kaikquah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaikquah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Akaikquah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..JING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/potaotototo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("potaotototo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/potaotototo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/potaotototo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=potaotototo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Apotaotototo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..JIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weijianwong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weijianwong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/weijianwong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/weijianwong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weijianwong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Aweijianwong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f09"}},[_v("CS2103-F09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f09-1-data-conductors"}},[_v("CS2103-F09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("data coNdUctorS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09-1-data-conductors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAdministrative Director of CCAs (Co-Curricular Activities) in NUS who has to manage and access the database of the members. The database size is around 50 students. These directors are tech savvy who can type fast.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables users to efficiently and easily manage and access large CCA membership database (including creation, edit, and deletion of data entries)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1a9kYfmwuXTSDPhvDxFZHLqDkaGN5RGON-qcsrhxwXCA/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. HUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/cth06-Github"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cth06-Github")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/cth06-github.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/cth06-github.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cth06-github&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3Acth06-Github"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ERNE..RONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/somethingfishyfishy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("somethingfishyfishy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/somethingfishyfishy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/somethingfishyfishy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=somethingfishyfishy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3Asomethingfishyfishy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JIN ..STON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/WinstonJin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("WinstonJin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/winstonjin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/winstonjin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=winstonjin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3AWinstonJin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..I SI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LowXiSi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LowXiSi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/lowxisi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/lowxisi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lowxisi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3ALowXiSi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU Z..NGFU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wuzengfu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wuzengfu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/wuzengfu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/wuzengfu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wuzengfu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3Awuzengfu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f09-2-realconnect"}},[_v("CS2103-F09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("RealConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09-2-realconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal Estate/Sales Agents\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA user-friendly address book that simplifies the process of storing and retrieving client information. Categorize contacts into groups like buyers, sellers, and leads, helping you stay organized. Automate reminders and notes, ensuring you never miss an opportunity to engage clients. Easily organize contacts to their profile, for a streamlined experience.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1BOyh8IrdTpxgtjt2YFEOjupSehAZtvfs_LS-UD091AQ/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HE M..NHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/minhao23"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("minhao23")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/minhao23.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/minhao23.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=minhao23&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3Aminhao23"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAVI..GERI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/starbucksventi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("starbucksventi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/starbucksventi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/starbucksventi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=starbucksventi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3Astarbucksventi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUGI..UJIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jinnsuke"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jinnsuke")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/jinnsuke.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/jinnsuke.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jinnsuke&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3Ajinnsuke"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..XIYU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Wxy2003-xy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Wxy2003-xy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/wxy2003-xy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/wxy2003-xy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wxy2003-xy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3AWxy2003-xy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f09-3-talentcy"}},[_v("CS2103-F09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Talentcy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09-3-talentcy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for employees of talent recruitment departments of companies who want to manage contact of job applicants.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis app streamlines the process of managing talent contact information by centralizing essential contact details, making it easier to organise, search, and update information on potential candidates. Its search and filtering capabilities help recruiters quickly find profiles based on specific criteria, improving efficiency, and reducing time spent on administrative tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1sCnzwqayF-Az8qcZyVM59ndFGalKZdjv6cwEVGqfIkk/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN..K YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ChinSekYi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ChinSekYi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/chinsekyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/chinsekyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chinsekyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3AChinSekYi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HANS..JUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hansneddyanto"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hansneddyanto")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/hansneddyanto.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/hansneddyanto.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hansneddyanto&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3Ahansneddyanto"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HAST..ANTI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hazzle23"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hazzle23")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/hazzle23.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/hazzle23.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hazzle23&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3Ahazzle23"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VICE..AKHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/vicelyav"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("vicelyav")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/vicelyav.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/vicelyav.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vicelyav&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3Avicelyav"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f10"}},[_v("CS2103T-F10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-1-clienthub"}},[_v("CS2103T-F10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClientHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-1-clienthub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for tech savvy and independent financial advisors who have more than 50 clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product provides independent financial advisors with a streamlined tool to manage client details (eg. Track insurance policies). Optimized for simplicity and efficiency, this product makes the lives of financial advisors easier by offering easier access to relevant information for their clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ujzOuSrzMISrTGaP1CefukFCdysEnk_sHIGp6RrApzY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AHMA..ALIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ahmadsyuaib"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ahmadsyuaib")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/ahmadsyuaib.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/ahmadsyuaib.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ahmadsyuaib&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3Aahmadsyuaib"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HARI..SHAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Harithhh06"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Harithhh06")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/harithhh06.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/harithhh06.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=harithhh06&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3AHarithhh06"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JERE..N ZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jereeemyyyy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jereeemyyyy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/jereeemyyyy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/jereeemyyyy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jereeemyyyy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3Ajereeemyyyy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIN ..UBIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rubinnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rubinnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/rubinnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/rubinnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rubinnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3Arubinnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIU .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/L-rrrr"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("L-rrrr")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/l-rrrr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/l-rrrr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=l-rrrr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3AL-rrrr"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-2-clinicconnect"}},[_v("CS2103T-F10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClinicConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-2-clinicconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStaff working at private health screening clinics and attend to new and existing patients who prefer a unified platform to perform clinic-related tasks in one place.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUnified platform allowing clinic assistants to perform many clinic-related tasks in one place. Contains specific fields unique to healthcare screening clinics such as insurance providers, insurance processing status, patient screening package, screening dates, payment dues. Provides fast access to patient information through smart search and filtering capabilities.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1DOngDeMInmlPI_rEZJh_bXyAi8P-JMMTQ5JBdbSvRCI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..NESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DINESH1201"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DINESH1201")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/dinesh1201.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/dinesh1201.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dinesh1201&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3ADINESH1201"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN..YUEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Arren11111"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Arren11111")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/arren11111.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/arren11111.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arren11111&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3AArren11111"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yuanchengg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yuanchengg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/yuanchengg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/yuanchengg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yuanchengg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3Ayuanchengg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEOW..OLYN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jolynleow2301"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jolynleow2301")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/jolynleow2301.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/jolynleow2301.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jolynleow2301&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3Ajolynleow2301"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PATC..UMAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yugan01"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yugan01")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/yugan01.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/yugan01.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yugan01&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3Ayugan01"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-3-nustates"}},[_v("CS2103T-F10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NUStates]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-3-nustates","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal Estate Agents in Singapore managing contacts\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal Estate Agents can organize and categorize client and seller contacts, schedule appointments, contact clients about new property listings that match their client's preferences, and be notified to contact clients on key dates or at regular intervals.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1M_6hTGRPNeLusQyEN4q9nSI-ebz4OxYyGQBKaRAI5gI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DYLA..FUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Potatoad88"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Potatoad88")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/potatoad88.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/potatoad88.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=potatoad88&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3APotatoad88"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ITZXITZX"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ITZXITZX")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/itzxitzx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/itzxitzx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itzxitzx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3AITZXITZX"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW .. BIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/OrangeCatLoves"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("OrangeCatLoves")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/orangecatloves.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/orangecatloves.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=orangecatloves&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3AOrangeCatLoves"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PATO..ISHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/triishaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("triishaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/triishaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/triishaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=triishaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3Atriishaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..QUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xqtann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xqtann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/xqtann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/xqtann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xqtann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3Axqtann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-4-techconnect"}},[_v("CS2103T-F10-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TechConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-4-techconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe product is for users who are looking for job opportunities in the tech industry.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe app provides users access to companies' contacts as well as various information regarding the company.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1LYIN6iWqDW-H0YXESw0BPUrFaW3qPvZcc6ykhKzbnIM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rynlwhh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rynlwhh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/rynlwhh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/rynlwhh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rynlwhh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Arynlwhh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LING.. YAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LingZiyann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LingZiyann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/lingziyann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/lingziyann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lingziyann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3ALingZiyann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG ..TTIS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mattisongjj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mattisongjj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/mattisongjj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/mattisongjj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mattisongjj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Amattisongjj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..EONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tckeong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tckeong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/tckeong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/tckeong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tckeong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Atckeong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VINC.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/vinceg4"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("vinceg4")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/vinceg4.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/vinceg4.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vinceg4&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Avinceg4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f10"}},[_v("CS2103-F10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f10-1-supplycentral"}},[_v("CS2103-F10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SupplyCentral]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10-1-supplycentral","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA Business owner managing a small sized company who frequently procures goods from suppliers.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOne-stop solution for small business owners to keep track of their contracted suppliers, along with any other relevant business information such as purchased goods & services, dates and other potential waybill information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1C4nZ49QlduXBYTzFtu_DTt-1gqi-RDrIC-jfhInUSRk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ABIC..ARAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thenosewizard"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thenosewizard")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/thenosewizard.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/thenosewizard.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thenosewizard&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Athenosewizard"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. LIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ossaris56"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ossaris56")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/ossaris56.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/ossaris56.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ossaris56&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Aossaris56"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEON..HANE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/stephaneleong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("stephaneleong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/stephaneleong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/stephaneleong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=stephaneleong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Astephaneleong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..IALE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jialegitgud"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jialegitgud")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/jialegitgud.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/jialegitgud.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jialegitgud&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Ajialegitgud"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEE ..HWEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yanhwee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yanhwee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/yanhwee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/yanhwee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yanhwee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Ayanhwee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f10-2-socialbook"}},[_v("CS2103-F10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SocialBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10-2-socialbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSocial worker\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nthe address book acts as an easy way to locate/contact families,and keep track of how long it has been since their last visit.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Z8T1fEUBexSmQ5XOu-H0NQqsuJgwNjvYGSuWGYpPWQE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AL R..AD A")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AbdulrahmanAlRammah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AbdulrahmanAlRammah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/abdulrahmanalrammah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/abdulrahmanalrammah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=abdulrahmanalrammah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3AAbdulrahmanAlRammah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANDR..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Andrew22Teoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Andrew22Teoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/andrew22teoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/andrew22teoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=andrew22teoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3AAndrew22Teoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..HAEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Rachael-Chan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Rachael-Chan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/rachael-chan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/rachael-chan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rachael-chan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3ARachael-Chan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIAU..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/liauzhanyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("liauzhanyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/liauzhanyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/liauzhanyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=liauzhanyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3Aliauzhanyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAYN.. YUH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rayray39"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rayray39")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/rayray39.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/rayray39.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rayray39&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3Arayray39"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f10-3-bizbook"}},[_v("CS2103-F10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BizBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10-3-bizbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStore managers in the Food and Beverage industry who are responsible for managing contacts for Sales and Delivery.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product aims to streamline and simplify sales and delivery management for Food and Beverage outlets. By providing an organized, easy-to-use platform for managing business contacts, it helps store managers save time and improve efficiency, ensuring smooth coordination between sales and delivery operations.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1EeGK4QJTxPBJMFeEeBwHVqvk93lwqeEUr8LtCIDDeBk"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOEL.. HON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/joeltio"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("joeltio")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/joeltio.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/joeltio.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=joeltio&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3Ajoeltio"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KENN.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KennethTeo2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KennethTeo2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/kennethteo2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/kennethteo2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kennethteo2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3AKennethTeo2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ITLimJiaWei"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ITLimJiaWei")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/itlimjiawei.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/itlimjiawei.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itlimjiawei&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3AITLimJiaWei"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH.. FEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nicholas-Cheng-De-Fei"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nicholas-Cheng-De-Fei")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/nicholas-cheng-de-fei.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/nicholas-cheng-de-fei.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholas-cheng-de-fei&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3ANicholas-Cheng-De-Fei"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..KERR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sheenkerr"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sheenkerr")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/sheenkerr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/sheenkerr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sheenkerr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3Asheenkerr"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f11"}},[_v("CS2103T-F11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-1-concertphonebook"}},[_v("CS2103T-F11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ConcertPhonebook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-1-concertphonebook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nConcert organisers who prefer CLI over GUI and have a lot of contacts to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAllows concert organisers to add, delete and quickly sift through many contacts, from whom to obtain required resources or fulfil their professional obligations. Contacts have categories, such as band, audience, and staff. It provides an efficient CLI optimised for fast typists, complemented by an interactive GUI for convenience.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1PXDrMpuVDXDr4VTyzfX0dRvDQu-XaHrdfzdiQluigNk/edit?usp=drivesdk"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KART..ARAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/karthickkc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("karthickkc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/karthickkc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/karthickkc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=karthickkc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Akarthickkc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG H..JING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hj235"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hj235")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/hj235.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/hj235.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hj235&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Ahj235"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUBR..EYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SKarthikeyan28"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SKarthikeyan28")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/skarthikeyan28.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/skarthikeyan28.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=skarthikeyan28&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3ASKarthikeyan28"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..SLEY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wes-w-z-h"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wes-w-z-h")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/wes-w-z-h.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/wes-w-z-h.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wes-w-z-h&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Awes-w-z-h"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZACH..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bbbbcccd"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bbbbcccd")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/bbbbcccd.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/bbbbcccd.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bbbbcccd&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Abbbbcccd"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-2-ccaconnect"}},[_v("CS2103T-F11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CCAConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-2-ccaconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe product is for CCA leaders in NUS who want to manage contact details of all relevant CCA personnel\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur project aims to assist CCA leaders in NUS in managing and collating relevant CCA personnel’s contact details. This is done via a clean user interface with fast access to the contact information of relevant CCA personnel, providing users a one-stop solution to help manage CCA manpower related considerations.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1tHwA5ZRhEGfuIXDfa_Q7J5rIyAiUz8k4QNvcsi1k08c/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CAI ..NXIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Rachelcoll"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Rachelcoll")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/rachelcoll.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/rachelcoll.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rachelcoll&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3ARachelcoll"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CALE..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/superb-sushi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("superb-sushi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/superb-sushi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/superb-sushi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=superb-sushi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Asuperb-sushi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOI.. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yyihaoc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yyihaoc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/yyihaoc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/yyihaoc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yyihaoc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Ayyihaoc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHI ..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shizy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shizy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/shizy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/shizy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shizy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Ashizy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..LIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weiliann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weiliann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/weiliann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/weiliann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weiliann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Aweiliann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-3-clinicbuddy"}},[_v("CS2103T-F11-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClinicBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-3-clinicbuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHealthcare professionals in small clinics, such as doctors, nurses, and administrative staff, who need an organized system for managing patient records, treatment plans, and future appointments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSmall, private clinics do not have access to advanced administration systems to manage patients as they are expensive and meant for bigger hospitals. ClinicBuddy enhances the patient management process for small clinics, creating a platform to track patient information such as their treatment, contact information, visit records and future appointments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1iIWqfy7Od1ldygLRqYYVT8ugG6S5umBvIUAwiAQSALo/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALEZ.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Al-ez"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Al-ez")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/al-ez.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/al-ez.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=al-ez&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AAl-ez"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..ADAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/colinac"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("colinac")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/colinac.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/colinac.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=colinac&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3Acolinac"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAYN.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jaynon"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jaynon")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/jaynon.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/jaynon.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jaynon&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AJaynon"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUN ..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ArtillerySun"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ArtillerySun")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/artillerysun.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/artillerysun.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=artillerysun&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AArtillerySun"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEA .. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JellyPenguinnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JellyPenguinnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/jellypenguinnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/jellypenguinnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jellypenguinnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AJellyPenguinnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-4-ezstates"}},[_v("CS2103T-F11-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EZSTATES]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-4-ezstates","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for freelance real estate agents who have to manage numerous property transactions and client interactions. It caters to those who need a fast, efficient tool to organize all their client data, track deals, and wish to streamline their workflow through command-line operations.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEZSTATES provides freelance real estate agents quick access to client details, categorized by their property’s needs and interests through a user-friendly CLI, streamlining operations by enabling swift and intuitive command-line interactions. This simplifies their workflow, boosts efficiency and enhances their client service.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1I1U7cg7SjBzk0UVz-yVcWPW7D1aP3xKOEicpqHcjF-w/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LAM ..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lrongyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lrongyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/lrongyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/lrongyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lrongyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Alrongyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..MZAH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/muhdbhz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("muhdbhz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/muhdbhz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/muhdbhz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=muhdbhz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Amuhdbhz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..DIAS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seandias"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seandias")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/seandias.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/seandias.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seandias&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Aseandias"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/e1121208"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1121208")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/e1121208.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/e1121208.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=e1121208&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Ae1121208"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..ZHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wang-h-z"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wang-h-z")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/wang-h-z.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/wang-h-z.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wang-h-z&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Awang-h-z"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f11"}},[_v("CS2103-F11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f11-1-tachy"}},[_v("CS2103-F11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F11-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAchy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f11-1-tachy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTech-savvy Tuition Teachers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide a fast CLI for tutors to manage and track students' work and submissions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/173iNEF6egbVOLGqyoM7d2-h1G-U3ypUazlNacIftgY8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALTH.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/althea28"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("althea28")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/althea28.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/althea28.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=althea28&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Aalthea28"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AVRI..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/avrilmohh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("avrilmohh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/avrilmohh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/avrilmohh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=avrilmohh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Aavrilmohh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("EMMA.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/emmannyyy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("emmannyyy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/emmannyyy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/emmannyyy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=emmannyyy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Aemmannyyy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JIAN..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jian7490"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jian7490")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/jian7490.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/jian7490.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jian7490&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Ajian7490"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAU .. TOM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lm-44"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lm-44")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/lm-44.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/lm-44.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lm-44&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Alm-44"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f11-2-tutorease"}},[_v("CS2103-F11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TutorEase]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f11-2-tutorease","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for freelance pre-university home tutors who prefer CLI over GUI and must keep track of many students, student locations and schedules\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur software enhances tutoring efficiency by simplifying management tasks, reducing scheduling conflicts, and providing a clear overview of classes and finances. It enables seamless tutor coordination with students and parents, improving communication and organization, ultimately leading to a more effective and stress-free educational experience.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1FqN1gEOUkQg225T_amdpwm85VyLXHTgUws6inysdl1Y/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AW J..RIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Chronoxy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Chronoxy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/chronoxy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/chronoxy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chronoxy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3AChronoxy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOH ..BERT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NorbertLoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NorbertLoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/norbertloh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/norbertloh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=norbertloh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3ANorbertLoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW .. IAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/"}},[_v("``")])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3A"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MA X..XIZI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Ma-Xizi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ma-Xizi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/ma-xizi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/ma-xizi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ma-xizi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3AMa-Xizi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..THAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ethantyh692"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ethantyh692")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/ethantyh692.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/ethantyh692.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethantyh692&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3Aethantyh692"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f12"}},[_v("CS2103-F12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-1-insureance"}},[_v("CS2103-F12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("InSUREance]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-1-insureance","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNew Insurance Agents with a preference for typing instead of using point and click. Has many different priority customers with diverse backgrounds and types of insurance. The app should also help the insurance agent keep track of their customers claims and appointments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur apps help insurance agents keep track of new and existing clients. This allows them to maximise their reach to their contacts and optimise their profits each month.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://drive.google.com/drive/folders/1tUMTjtYdslE0APgtso1N3M9x30g9Dz8Y"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zi-yii"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zi-yii")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/zi-yii.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/zi-yii.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zi-yii&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3Azi-yii"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HO Y..N QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yanqiyqh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yanqiyqh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/yanqiyqh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/yanqiyqh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yanqiyqh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3Ayanqiyqh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MATT..ERNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/matthewyip1511"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("matthewyip1511")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/matthewyip1511.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/matthewyip1511.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=matthewyip1511&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3Amatthewyip1511"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("REZW..HMED")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RezwanAhmed123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RezwanAhmed123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/rezwanahmed123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/rezwanahmed123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rezwanahmed123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3ARezwanAhmed123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-2-t-assistant"}},[_v("CS2103-F12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("T_Assistant]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-2-t-assistant","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for TAs in group project based courses, who prefer CLI over GUI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHelps to track the following: - Students - Their groups - Group projects’ progress - TA will create projects and tasks related to the projects - Then assign the projects to groups - Mark the tasks as the groups complete - Identify those who are falling behind\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1abBcDGnCER1RR_Wmai2G_S8zSHXi7TnFVgMYTsmcEa4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LYE ..EWIS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ghos7ie"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ghos7ie")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/ghos7ie.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/ghos7ie.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ghos7ie&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3Aghos7ie"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SNG ..IREE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dez2003"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dez2003")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/dez2003.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/dez2003.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dez2003&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3Adez2003"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. YAP")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SooYap"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SooYap")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/sooyap.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/sooyap.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sooyap&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3ASooYap"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..NYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/YANYAN-w"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YANYAN-w")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/yanyan-w.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/yanyan-w.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yanyan-w&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3AYANYAN-w"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-3-grub"}},[_v("CS2103-F12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Grub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-3-grub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nDiners\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIt offers a curated list of nearby restaurants tailored to your preferences, ensuring quick and efficient searches for local dining options.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ar2yfvC_m2KPvZ7QgLoyePJw-NtzQ5IkBMs6d6sMV5s/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMAD..SUMA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AmadeusEka"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AmadeusEka")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/amadeuseka.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/amadeuseka.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=amadeuseka&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3AAmadeusEka"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAGD..NDAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JagdeepSinghNUS"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JagdeepSinghNUS")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/jagdeepsinghnus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/jagdeepsinghnus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jagdeepsinghnus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3AJagdeepSinghNUS"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAW .. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shotnothing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shotnothing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/shotnothing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/shotnothing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shotnothing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3Ashotnothing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/WeiHanWong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("WeiHanWong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/weihanwong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/weihanwong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weihanwong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3AWeiHanWong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-4-studentmanagerpro"}},[_v("CS2103-F12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("StudentManagerPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-4-studentmanagerpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nsecondary school teachers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA teacher is normally assigned to a large number of students making it hard for them to keep track of all the students/project groups at once. With our product, they can track all of the students’ test scores, submissions, progress and also, access their particulars with ease.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/13vXn46JN8OUtpjXW-YA0XyzMhG3Xp5y15O6kLEwxJH4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. HEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jason-chuah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jason-chuah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/jason-chuah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/jason-chuah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jason-chuah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3Ajason-chuah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOH ..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gohqingkhang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gohqingkhang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/gohqingkhang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/gohqingkhang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gohqingkhang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3Agohqingkhang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MURA..UTHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Shruthiiii03"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Shruthiiii03")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/shruthiiii03.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/shruthiiii03.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shruthiiii03&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3AShruthiiii03"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..ENRY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Tanziyanghenry"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tanziyanghenry")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/tanziyanghenry.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/tanziyanghenry.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tanziyanghenry&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3ATanziyanghenry"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TENG..LOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/BunnyHoppp"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("BunnyHoppp")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/bunnyhoppp.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/bunnyhoppp.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bunnyhoppp&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3ABunnyHoppp"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f12"}},[_v("CS2103T-F12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-1-contactcs"}},[_v("CS2103T-F12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ContactCS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-1-contactcs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for NUS CS freshmen who are unfamiliar with the school system and find it frustrating to gather contacts from all types of platforms.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product allows NUS CS freshmen to easily locate the admin contact details when needed, which helps them better manage contact details of their professors, classmates, CCA mates, offices, emergency helplines, etc. so that they can focus more on their study.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://nusu.sharepoint.com/:w:/s/CS2103TG19ProjectGroup535/Eao0muS8ZVdOvngA5QROmSAB2I1DsKzC9kNXjvAz8W_ndw?e=ESWQ1b"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ELIN..G EE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Elinengu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Elinengu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/elinengu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/elinengu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=elinengu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3AElinengu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HUAN..IAXI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/huangjiaxi1111"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("huangjiaxi1111")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/huangjiaxi1111.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/huangjiaxi1111.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=huangjiaxi1111&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3Ahuangjiaxi1111"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAO ..GKAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MAOXIONGKAI"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MAOXIONGKAI")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/maoxiongkai.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/maoxiongkai.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=maoxiongkai&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3AMAOXIONGKAI"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..SENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weiseng18"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weiseng18")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/weiseng18.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/weiseng18.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weiseng18&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3Aweiseng18"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHU ..ANYI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lithops-zty"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lithops-zty")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/lithops-zty.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/lithops-zty.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lithops-zty&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3Alithops-zty"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-2-educonnect"}},[_v("CS2103T-F12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-2-educonnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for teachers looking to manage their students' details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n- Add, edit and delete chunks of information quickly - Typos are forgiving and there will be no need to backtrack using backspace, you can just keep going - Effective use of screen real estate - Can be used without using the mouse at all - Customizable commands - Easily share contacts (ie copy paste)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1D_VlYtPQ-Ebi6ZTv5rwy0xuv8u5m4S0n7YwikGMkZFc/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ADRI..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AgentHagu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AgentHagu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/agenthagu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/agenthagu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=agenthagu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3AAgentHagu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMOS..N EE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/amoschee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("amoschee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/amoschee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/amoschee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=amoschee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3Aamoschee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GARG..JESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/maahir-garg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("maahir-garg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/maahir-garg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/maahir-garg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=maahir-garg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3Amaahir-garg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOEL..RNAV")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Arnaxx54"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Arnaxx54")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/arnaxx54.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/arnaxx54.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arnaxx54&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3AArnaxx54"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NIHA..MESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nihalramesh12629"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nihalramesh12629")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/nihalramesh12629.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/nihalramesh12629.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nihalramesh12629&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3Anihalramesh12629"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-3-medibase3"}},[_v("CS2103T-F12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MediBase3]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-3-medibase3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for doctors who might want to keep track of their patient's history, reports and appointments. Since doctor's are busy focusing on their patients, they would prefer typing their patient's details to save time.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nMake it easier for doctors to keep track of their patients progress and appointment timings. This will improve their overall efficiency and improve their work life balance, as doctors are some of the most overworked professions in Singapore.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1YLYrqKEbtA8UyGKtJOISQjCPZbvU7-Hj-afOBjj6r9Q/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HO W..NIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hweinian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hweinian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/hweinian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/hweinian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hweinian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3Ahweinian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRES.. LUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/PresleyChew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PresleyChew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/presleychew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/presleychew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=presleychew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3APresleyChew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIVA..KRAJ")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TechRaj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TechRaj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/techraj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/techraj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=techraj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3ATechRaj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAP ..ZHUO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yong-zhuo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yong-zhuo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/yong-zhuo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/yong-zhuo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yong-zhuo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3Ayong-zhuo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YUKN..AJAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yadobler"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yadobler")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/yadobler.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/yadobler.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yadobler&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3Ayadobler"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-4-vbook"}},[_v("CS2103T-F12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("VBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-4-vbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for freelance software developers who value privacy and self-hosting, preferring typing over mouse actions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA secure, intuitive contact management system tailored for developers, offering seamless integration between command-line efficiency and UI simplicity. It prioritizes data privacy, allowing users to manage and protect their contacts with minimal friction.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/19VMS2xwpYiRJs3xH4eaFqOt96IY67BTCt48Qx2XVtG0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANSE..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/anselmlong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("anselmlong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/anselmlong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/anselmlong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=anselmlong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Aanselmlong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LERO..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leroytan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leroytan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/leroytan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/leroytan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leroytan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Aleroytan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..LLAH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/raihahahan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("raihahahan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/raihahahan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/raihahahan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=raihahahan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Araihahahan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RACH.. MIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rachelyeohm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rachelyeohm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/rachelyeohm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/rachelyeohm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rachelyeohm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Arachelyeohm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f13"}},[_v("CS2103T-F13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-1-tahub"}},[_v("CS2103T-F13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-1-tahub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching Assistants (TAs) in academic institutions such as universities, colleges, and online learning platforms. - Role: TAs supporting professors and lecturers in managing course-related tasks. - Experience Level: New and experienced TAs handling multiple responsibilities. - Needs: Efficient management of student information and tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAHub simplifies the role of Teaching Assistants by providing a centralized hub to organize student information, and efficiently manage course-related tasks. This platform empowers TAs to focus more on enhancing student learning and less on administrative chaos.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/17hPaYDArariN7ejrwdR_VKaECxcdmz_MpXdfo0zxgp0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG ..RCUS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/marcusjhang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("marcusjhang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/marcusjhang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/marcusjhang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=marcusjhang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3Amarcusjhang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAXI.. LEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/notnotmax"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("notnotmax")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/notnotmax.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/notnotmax.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=notnotmax&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3Anotnotmax"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SKY ..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/S-K-Y-Light"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("S-K-Y-Light")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/s-k-y-light.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/s-k-y-light.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=s-k-y-light&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3AS-K-Y-Light"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEO ..ENCE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Clarenceeey"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Clarenceeey")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/clarenceeey.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/clarenceeey.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=clarenceeey&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3AClarenceeey"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEOH..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yhanyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yhanyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/yhanyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/yhanyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yhanyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3Ayhanyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-2-abcli"}},[_v("CS2103T-F13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ABCLI]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-2-abcli","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal estate agents with many clients to manage and require frequent updating and tracking of client information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nABCLI helps real estate agents manage their client contacts and schedules, and assists with outbound communication, creating a seamless and client-focused workflow.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://nusu-my.sharepoint.com/:w:/r/personal/e1157106_u_nus_edu/_layouts/15/Doc.aspx?sourcedoc=%7BF573890E-06D2-4118-951A-CE05DCF03635%7D&file=CS2103_tP_Notes.docx&fromShare=true&action=default&mobileredirect=true"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN..LING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ylchin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ylchin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/ylchin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/ylchin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ylchin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3Aylchin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KENN..LEWI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KennyLewi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KennyLewi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/kennylewi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/kennylewi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kennylewi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3AKennyLewi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG E..SWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Solomon0519"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Solomon0519")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/solomon0519.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/solomon0519.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=solomon0519&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3ASolomon0519"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Z.. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NgZiXin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NgZiXin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/ngzixin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/ngzixin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ngzixin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3ANgZiXin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YIOW..OONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/CreditableX"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CreditableX")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/creditablex.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/creditablex.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=creditablex&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3ACreditableX"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-3-dream-day-designer"}},[_v("CS2103T-F13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Dream Day Designer]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-3-dream-day-designer","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is targeted at wedding planners who have many contacts of vendors and clients to keep track of when planning the different weddings.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product provides a way to easily select suitable vendors and freelancers for a wedding event given specific parameters such as budget, time, commission, client needs (culture, style), location.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1VQudW2Kwq3_AzUwQ_z0N0t7sWta-hAXWU7saNc85970/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yizhong187"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yizhong187")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/yizhong187.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/yizhong187.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yizhong187&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3Ayizhong187"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FENG..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FYL2003"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FYL2003")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/fyl2003.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/fyl2003.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fyl2003&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3AFYL2003"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MERV.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Teddayz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Teddayz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/teddayz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/teddayz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=teddayz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3ATeddayz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG E..SPER")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/casperngeen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("casperngeen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/casperngeen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/casperngeen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=casperngeen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3Acasperngeen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YIP ..SLIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leslieyip02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leslieyip02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/leslieyip02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/leslieyip02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leslieyip02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3Aleslieyip02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-4-clientell"}},[_v("CS2103T-F13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Clientell]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-4-clientell","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFreelance consultants who prefer CLI over GUI and who are managing a large number of clients across various different (and possibly cross-related) industries.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nsimplifies managing diverse client contact information by offering fast, precise, and more customisable searching functionality. It also provides robust tag management for hierarchical relationships, making it easier to categorise and retrieve clients (useful for users with clients across multiple cross-related industries), and optimised for CLI users for speed and efficiency.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ueNiBphT3fm_Ov47hA1vsiWPZO0FLAigU6DcAV-MTxk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN.. JAK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/darkmoongreatsword"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("darkmoongreatsword")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/darkmoongreatsword.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/darkmoongreatsword.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=darkmoongreatsword&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Adarkmoongreatsword"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/beginner-web-developer"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("beginner-web-developer")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/beginner-web-developer.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/beginner-web-developer.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=beginner-web-developer&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Abeginner-web-developer"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Y..STIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kngys"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kngys")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/kngys.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/kngys.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kngys&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Akngys"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEH ..CHUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/reginateh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reginateh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/reginateh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/reginateh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=reginateh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Areginateh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TRAN..C MY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/trpmy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("trpmy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/trpmy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/trpmy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=trpmy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Atrpmy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f13"}},[_v("CS2103-F13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-1-spleetwaise"}},[_v("CS2103-F13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SpleetWaise]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-1-spleetwaise","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTech-savvy students looking to track shared expenses and manage who owes what.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSpleetWaise simplifies expense tracking for students, making it easy to split and manage shared costs. By offering a seamless solution to track who owes what, it eliminates the stress and confusion that often come with shared expenses, ensuring clarity and peace of mind for students who use SpleetWaise.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/wiki"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DONG..ANBO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rollingpencil"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rollingpencil")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/rollingpencil.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/rollingpencil.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rollingpencil&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3Arollingpencil"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GAVI..CHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/GavinSin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GavinSin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/gavinsin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/gavinsin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gavinsin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3AGavinSin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HE Y..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Dino-Nuggies"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Dino-Nuggies")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/dino-nuggies.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/dino-nuggies.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dino-nuggies&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3ADino-Nuggies"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..SEAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seanlim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seanlim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/seanlim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/seanlim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seanlim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3Aseanlim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEE .. ZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SeeYangZhi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SeeYangZhi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/seeyangzhi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/seeyangzhi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seeyangzhi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3ASeeYangZhi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-2-eventtory"}},[_v("CS2103-F13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EventTory]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-2-eventtory","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIndividuals responsible for planning and managing events such as corporate event managers, wedding planners, and social event coordinators, who need to communicate with multiple stakeholders.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEventTory simplifies the process of organizing events, from small gatherings to large-scale corporate functions, and is optimized for users who prefer a CLI-like interface. EventTory provides them with the ability to track event details and contact information for various vendors, allowing them to manage the status of multiple events concurrently.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Edv70omuqqv8wgLOaFbbiB4bymznlzsWUmo-re3IzoU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..SUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kahsuann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kahsuann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/kahsuann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/kahsuann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kahsuann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3Akahsuann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HANS..LANO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hanscau"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hanscau")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/hanscau.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/hanscau.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hanscau&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3Ahanscau"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JABE..E QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jasperabez"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jasperabez")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/jasperabez.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/jasperabez.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jasperabez&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3AJasperabez"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KEVI..TING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kevin-pek"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kevin-pek")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/kevin-pek.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/kevin-pek.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kevin-pek&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3Akevin-pek"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOK ..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/C5hives"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("C5hives")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/c5hives.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/c5hives.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=c5hives&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3AC5hives"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-3-seeree-2-0"}},[_v("CS2103-F13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SeeRee 2.0]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-3-seeree-2-0","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nBusy Students and Professionals with a need to coordinate available meeting times with their contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur application helps to coordinate meeting timings with relevant contacts, by keeping track of the schedules of the user’s contacts. This will be very useful for busy Students and Professionals that have many meetings with different people throughout the day. By making the commands similar to Natural Language, our application aims to provide a user-centric experience. The ease of use would make the product an attractive alternative to current Calendar applications that require the user to navigate multiple screens and input their meetings....\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1kmMHSzOK3H3Vziouc9pYdY1b4pc5hdhhwBTHLuZakcY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BREN..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Brendan8899"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Brendan8899")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/brendan8899.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/brendan8899.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=brendan8899&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3ABrendan8899"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LimKaiWei"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LimKaiWei")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/limkaiwei.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/limkaiwei.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limkaiwei&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3ALimKaiWei"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NON ..ANON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tata32000"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tata32000")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/tata32000.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/tata32000.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tata32000&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3Atata32000"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QUEK..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/QuekBingHeng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("QuekBingHeng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/quekbingheng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/quekbingheng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=quekbingheng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3AQuekBingHeng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..JEWI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jewiteo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jewiteo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/jewiteo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/jewiteo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jewiteo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3Ajewiteo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-4-talentconnect"}},[_v("CS2103-F13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TalentConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-4-talentconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor solo, freelance third party recruiters that need to keep track of many candidates (and their details) and job listings (with their requirements). The target users wants a free and lightweight CLI-optimized address book with features that help in matching candidates with jobs, all neatly packaged in a minimalistic GUI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA free and lightweight app designed for CLI users in mind - core functionality of managing contacts can be done much faster than GUI alternatives. Useful features for quick matching of candidates to jobs are provided. Our GUI would display only necessary information yet still look polished.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1KV_WDDNJqaDxJtrWP3OXHmIpyDjgjYTapq-vDgd6GsQ/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALEK..KWEK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AlekKwek18"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AlekKwek18")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/alekkwek18.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/alekkwek18.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=alekkwek18&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AAlekKwek18"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BENJ.. NAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Quasant"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Quasant")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/quasant.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/quasant.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=quasant&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AQuasant"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAU .. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wassilililily"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wassilililily")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/wassilililily.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/wassilililily.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wassilililily&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3Awassilililily"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOO ..BOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Green-Tea-123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Green-Tea-123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/green-tea-123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/green-tea-123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=green-tea-123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AGreen-Tea-123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH ..HIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KengHian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KengHian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/kenghian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/kenghian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kenghian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AKengHian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f15"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f15"}},[_v("CS2103T-F15"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-1-novacare"}},[_v("CS2103T-F15-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NovaCare]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-1-novacare","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for nurses that have tp eals with different kind of patients and each patient has a list of tasks associated with it\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHealthcare personnel face many duties under a high stress environment, and they need a system to document details efficiently. Organised Patient Care: Manage contact details, schedules, important notes for each patient Task Management: Provides alerts for critical tasks (administering medication etc) Critical Insights: Dashboard with patient data and task overviews\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1J0h2tOMQ2auT5KZi19A6w3Nvyvw77199bE7jGKffRm0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xinweichong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xinweichong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/xinweichong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/xinweichong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xinweichong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Axinweichong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOO..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yixianggg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yixianggg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/yixianggg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/yixianggg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yixianggg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Ayixianggg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JARR..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jarrellc1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jarrellc1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/jarrellc1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/jarrellc1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jarrellc1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Ajarrellc1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..AMIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/benjiBase"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("benjiBase")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/benjibase.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/benjibase.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=benjibase&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3AbenjiBase"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..AVIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gavinsoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gavinsoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/gavinsoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/gavinsoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gavinsoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Agavinsoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-2-educontacts"}},[_v("CS2103T-F15-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduContacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-2-educontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTertiary Teachers and Educators\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAn address book tailored for educators simplifies student and parent contact management, enhances communication tracking, and integrates progress reports, helping teachers save time and foster effective collaboration across the school community.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Vvv2CarGU4TyzEtrbAHxWY989MA4tHzrHfrQqT2nO5E/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ETHA.. ERN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ethan-goh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ethan-goh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/ethan-goh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/ethan-goh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethan-goh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Aethan-goh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JESS..TEJA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jessica2828"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jessica2828")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/jessica2828.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/jessica2828.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jessica2828&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Ajessica2828"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JYL27"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JYL27")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/jyl27.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/jyl27.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jyl27&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3AJYL27"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..NDON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/btbrandon"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("btbrandon")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/btbrandon.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/btbrandon.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=btbrandon&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Abtbrandon"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAY ..LIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/juliantayyc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("juliantayyc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/juliantayyc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/juliantayyc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=juliantayyc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Ajuliantayyc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-3-property"}},[_v("CS2103T-F15-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PROperty]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-3-property","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProperty agents responsibilities include managing a large list of property listings, coordinating with clients and potential buyers, conducting property viewings, negotiating deals, and handling paperwork related to real estate transactions. They are often mobile, needing quick and easy access to information, and manage a large client and property database.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAgents often have difficulty keeping track of the large client and property database. Our address book allows property agents to manage prospective and existing customers by sorting them into different categories including housing type and income level. Moreover, they can keep track of house visits via an events management system.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1vl9Nw4C39E6JwXAGLu2UfAQoxjWNk8XE-Nj9su4oYjM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DYLA.. LAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Vatinius"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Vatinius")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/vatinius.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/vatinius.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vatinius&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3AVatinius"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/BuffWuff1712"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("BuffWuff1712")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/buffwuff1712.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/buffwuff1712.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=buffwuff1712&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3ABuffWuff1712"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAY ..N YE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tayxuenye"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tayxuenye")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/tayxuenye.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/tayxuenye.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tayxuenye&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3Atayxuenye"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Tkaixiang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tkaixiang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/tkaixiang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/tkaixiang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tkaixiang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3ATkaixiang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN.. YAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sayomaki"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sayomaki")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/sayomaki.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/sayomaki.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sayomaki&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3Asayomaki"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-4-wedlinker"}},[_v("CS2103T-F15-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("WedLinker]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-4-wedlinker","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProfessional wedding planners who coordinate with a variety of vendors, venues, and clients across different locations for a wedding, and prefer to quickly retrieve and process contact data using text-based commands.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSimplifies managing wedding-related contacts through text-based commands by providing a centralized address book designed to efficiently handle the complexities of coordinating with multiple vendors, venues, and clients, while streamlining communication and event planning tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1LdstNiC-RPVcMKvYaNvcAtYgJAx4FuWH09uT6pKvMsE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DANZ.. ZHE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DanzaSeah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DanzaSeah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/danzaseah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/danzaseah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=danzaseah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3ADanzaSeah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NGIO.. BIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/HanB1n"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("HanB1n")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/hanb1n.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/hanb1n.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hanb1n&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3AHanB1n"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PEH ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tingxuanp"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tingxuanp")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/tingxuanp.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/tingxuanp.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tingxuanp&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3Atingxuanp"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RICC..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/riccoljy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("riccoljy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/riccoljy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/riccoljy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=riccoljy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3Ariccoljy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SYCH..ASHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dasha3412"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dasha3412")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/dasha3412.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/dasha3412.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dasha3412&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3Adasha3412"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f14a"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f14a"}},[_v("CS2103T-F14a"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-1-ugteach"}},[_v("CS2103T-F14a-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("UGTeach]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-1-ugteach","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur CLI-based address book empowers undergraduate private tutors to efficiently manage payments and organize schedules. It streamlines tutoring operations and ensures you stay organized. It is optimized for users who prefer CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur CLI-based address book empowers undergraduate private tutors to efficiently manage payments, track student performance, and organize schedules. It streamlines tutoring operations, ensuring you stay organized and focused on helping your students achieve their academic goals. It is optimized for users who prefer CLI\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1KX_qw-7SBZClJHja27qpCasQu5f_gv3x2GJLuymFYsY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Feng1231"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Feng1231")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/feng1231.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/feng1231.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=feng1231&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3AFeng1231"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DINH.. DAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DennieDan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DennieDan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/denniedan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/denniedan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=denniedan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3ADennieDan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOUM..SAHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Soumyadip-cmd"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Soumyadip-cmd")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/soumyadip-cmd.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/soumyadip-cmd.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=soumyadip-cmd&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3ASoumyadip-cmd"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TIMO.. TAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/teamotitan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("teamotitan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/teamotitan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/teamotitan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=teamotitan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3Ateamotitan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH .. FAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TY1Fan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TY1Fan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/ty1fan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/ty1fan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ty1fan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3ATY1Fan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-2-sellsavvy"}},[_v("CS2103T-F14a-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SellSavvy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-2-sellsavvy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIndependent sellers/dropshipping business owners selling on platforms like Carousell, who lack a central platform for dropshipping and delivery order management.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor small independent sellers, organizing client lists can be challenging. SellSavvy offers a centralized platform to store orders and track deliveries, streamlining dropshipping management. SellSavvy is optimized for tech-savvy fast-typing users through command-line interface and efficient functionalities.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Wg3O8x3wIcT9QLpzhvF91LW2vmLvLPR3dztPVMFfktM/edit?usp=drivesdk"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FOO ..CHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FooChao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooChao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/foochao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/foochao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=foochao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3AFooChao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaixuan477"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaixuan477")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/kaixuan477.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/kaixuan477.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaixuan477&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3Akaixuan477"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG K..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/awdse22"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("awdse22")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/awdse22.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/awdse22.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=awdse22&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3Aawdse22"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YU S..TONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yu-sutong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yu-sutong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/yu-sutong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/yu-sutong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yu-sutong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3Ayu-sutong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-3-clientele"}},[_v("CS2103T-F14a-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Clientele+]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-3-clientele","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFreelance software developers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInstead of using separate apps for meetings, contacts, and payments, use our app to track client contacts, payments, and job referrals, optimised for users who prefer CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1C9Ws1dRFgzP0pbdu4yFQz0ScBHapD4AMxx00uMHABoM/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LING..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JunLongling"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JunLongling")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/junlongling.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/junlongling.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=junlongling&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3AJunLongling"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRAK..INGH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Dinoman44"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Dinoman44")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/dinoman44.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/dinoman44.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dinoman44&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3ADinoman44"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAHU..RWAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rahula1008"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rahula1008")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/rahula1008.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/rahula1008.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rahula1008&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3Arahula1008"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TANG..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jktang14"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jktang14")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/jktang14.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/jktang14.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jktang14&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3Ajktang14"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TUSH..NWAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tanwartushar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tanwartushar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/tanwartushar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/tanwartushar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tanwartushar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3Atanwartushar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-4-campusconnect"}},[_v("CS2103T-F14a-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CampusConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-4-campusconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nuniversity students and staffs\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis app addresses the challenge of building community and collaboration among students and staff by connecting them based on shared modules, clubs, and hobbies. It simplifies the process of finding and accessing contacts for professors and teaching staff, fostering an engaged and supportive academic environment.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1pNdItQwz05w2jIHS-8TAVrb8LetDhRm3EmDsfVCdF34/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..IXUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/CYX22222003"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CYX22222003")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/cyx22222003.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/cyx22222003.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cyx22222003&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3ACYX22222003"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUST.. REN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yooplo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yooplo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/yooplo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/yooplo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yooplo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3Ayooplo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NGUY..OANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/blackpanther9229"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("blackpanther9229")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/blackpanther9229.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/blackpanther9229.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=blackpanther9229&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3Ablackpanther9229"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..JOHN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chrisjohntan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chrisjohntan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/chrisjohntan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/chrisjohntan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chrisjohntan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3Achrisjohntan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KrashKart"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KrashKart")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/krashkart.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/krashkart.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=krashkart&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3AKrashKart"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f14b"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f14b"}},[_v("CS2103T-F14b"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-1-socialbook"}},[_v("CS2103T-F14b-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SocialBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-1-socialbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSocial Worker, targeting low-income families with kids\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur app aims to streamline the process of social workers contacting and assisting families. It can also help social workers easily prioritise which families need more help, where to get the help, and navigate through families compared to using traditional Excel sheets.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Os0mVaskpPjVjEzcEIX0iLCnRwVpuPFxLC6tfi6ptEo/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ARJU..ANAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/arjun2598"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("arjun2598")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/arjun2598.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/arjun2598.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arjun2598&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3Aarjun2598"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEON.. ZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LeongWZ"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LeongWZ")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/leongwz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/leongwz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leongwz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3ALeongWZ"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG W..CENT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nws321"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nws321")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/nws321.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/nws321.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nws321&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3Anws321"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("OH Y..MENT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Gra7ityIC3"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gra7ityIC3")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/gra7ityic3.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/gra7ityic3.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gra7ityic3&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3AGra7ityIC3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TERE.. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TerenceWongsExtravaganza"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TerenceWongsExtravaganza")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/terencewongsextravaganza.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/terencewongsextravaganza.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=terencewongsextravaganza&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3ATerenceWongsExtravaganza"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-2-tahub-contacts"}},[_v("CS2103T-F14b-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAHub Contacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-2-tahub-contacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA busy Year 2 CS student, currently a TA of one or more classes, with many commitments who is comfortable with a command line interface, and faces lack of time to keep track of his students' contact details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAHub Contacts is a contact management app that helps them save time by having easy reference to their tutees' contact details, while allowing quick view of other essential data related to the tutee such as grades, participation, GitHub usernames when there is a need to contact them.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1XexU3jPNSLEXA8uvo4p_Knbm5IDvN5Oi-ROUeA_is1Q/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Zeepheru"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Zeepheru")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/zeepheru.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/zeepheru.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zeepheru&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3AZeepheru"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..SUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FlyingDonkeys"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FlyingDonkeys")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/flyingdonkeys.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/flyingdonkeys.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=flyingdonkeys&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3AFlyingDonkeys"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LATH..IVYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/devivy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("devivy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/devivy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/devivy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=devivy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3Adevivy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAXI.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/miloaisdino"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("miloaisdino")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/miloaisdino.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/miloaisdino.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=miloaisdino&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3Amiloaisdino"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEOH..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/accountexeregister"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("accountexeregister")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/accountexeregister.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/accountexeregister.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=accountexeregister&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3Aaccountexeregister"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-3-contactmate"}},[_v("CS2103T-F14b-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ContactMate]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-3-contactmate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEmployees at Active Ageing Centres\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEasy way to manage regular checkups. Fast, convenient and reliable way to organise contacts and ensure that everyone is checked up on a regular basis. It solves the problem of having to manually manage all the elderly just to keep up with the government’s (AIC) requirements.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1eWI5Rp1Zy4cRIW3mugGWmQXJVmnidlDuYnLdtZk3wdY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BREN..GJIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/brendanng7"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("brendanng7")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/brendanng7.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/brendanng7.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=brendanng7&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3Abrendanng7"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..RIEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/GabrielCWT"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GabrielCWT")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/gabrielcwt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/gabrielcwt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gabrielcwt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3AGabrielCWT"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LINE.. GOH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/linette-g"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("linette-g")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/linette-g.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/linette-g.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=linette-g&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3Alinette-g"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..YING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zyng233"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zyng233")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/zyng233.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/zyng233.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zyng233&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3Azyng233"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZEN .. KOH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Zenkoh1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Zenkoh1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/zenkoh1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/zenkoh1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zenkoh1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3AZenkoh1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-4-financial-assurance-revolutionary-telemarketer"}},[_v("CS2103T-F14b-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Financial Assurance Revolutionary Telemarketer]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-4-financial-assurance-revolutionary-telemarketer","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for financial advisors who specialise mainly in client outreach\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAllowing agents to easily keep track of who they have and have not contacted recently Sort their clients based on various categories (ie. occupation, SES, location) Automate the process of sending out catch-up messages to clients, automatic reminder to the user if a client has not been contacted in awhile\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1_QzlAbiqcr_58D0zK0Gpm1a4WA3YKoFclGakOURcbbQ/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AW J..STIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Justin-Aw46"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Justin-Aw46")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/justin-aw46.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/justin-aw46.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justin-aw46&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3AJustin-Aw46"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH..MING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AlphaPyke"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AlphaPyke")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/alphapyke.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/alphapyke.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=alphapyke&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3AAlphaPyke"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..O YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/meatyturtle"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("meatyturtle")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/meatyturtle.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/meatyturtle.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=meatyturtle&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3Ameatyturtle"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHAN.. TAY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Shantaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Shantaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/shantaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/shantaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shantaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3AShantaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TIEW..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/fymbc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("fymbc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/fymbc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/fymbc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fymbc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3Afymbc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')])],1),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-teams"}},[_v("tP Teams‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w08"}},[_v("CS2103T-W08‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w09"}},[_v("CS2103T-W09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w10"}},[_v("CS2103T-W10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w11"}},[_v("CS2103T-W11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w12"}},[_v("CS2103T-W12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w13"}},[_v("CS2103T-W13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w14"}},[_v("CS2103T-W14‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t08"}},[_v("CS2103T-T08‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t09"}},[_v("CS2103T-T09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t10"}},[_v("CS2103T-T10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t11"}},[_v("CS2103T-T11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t12"}},[_v("CS2103T-T12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t13"}},[_v("CS2103T-T13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t14"}},[_v("CS2103T-T14‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t15"}},[_v("CS2103T-T15‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t16"}},[_v("CS2103T-T16‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t17"}},[_v("CS2103T-T17‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f08"}},[_v("CS2103T-F08‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f09"}},[_v("CS2103T-F09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f09"}},[_v("CS2103-F09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f10"}},[_v("CS2103T-F10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f10"}},[_v("CS2103-F10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f11"}},[_v("CS2103T-F11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f11"}},[_v("CS2103-F11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f12"}},[_v("CS2103-F12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f12"}},[_v("CS2103T-F12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f13"}},[_v("CS2103T-F13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f13"}},[_v("CS2103-F13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f15"}},[_v("CS2103T-F15‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f14a"}},[_v("CS2103T-F14a‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f14b"}},[_v("CS2103T-F14b‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(1)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_m(0),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w08"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w08"}},[_v("CS2103T-W08"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-1-trackmate"}},[_v("CS2103T-W08-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TrackMate]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-1-trackmate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNUS SOC tutors who want to track their student's progress\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTrackMate offers a comprehensive application for educators to track their students’ current progress. It is optimized for educators who are proficient in Command Line Interface (CLI) and help them to reduce their workload and administrative burden.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1YGD-vDEcytXXLx873y6jvkZutBmx2wYJAXvABaOuchU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SamsonChew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SamsonChew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/samsonchew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/samsonchew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samsonchew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3ASamsonChew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FUI .. MIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Fui03"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Fui03")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/fui03.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/fui03.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fui03&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3AFui03"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LO Y.. ZHE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Reallyeasy1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Reallyeasy1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/reallyeasy1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/reallyeasy1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=reallyeasy1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3AReallyeasy1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..HIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tansanchian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tansanchian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/tansanchian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/tansanchian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tansanchian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3Atansanchian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEH ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/waihongteh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("waihongteh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-1.github.io/tp/images/waihongteh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-1.github.io/tp/team/waihongteh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=waihongteh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-1/tp/pulls?q=is%3Apr+author%3Awaihongteh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-2-eduvault"}},[_v("CS2103T-W08-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Eduvault]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-2-eduvault","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for admin at tuition centres and has to track a large number of student records.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnable easy management and fast access to student records for administrators working at tuition centres. We aim to provide easy tracking of payments to send reminders, learning progress of students and shifting of classes etc. This also helps tuition centres save time by reducing administrative burdens on their staff.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1bzjxhKceeUBWXWcnQ8U4miSz4XrGIcpUZvtr6_56uy0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMIT..TURI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/amitha2210"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("amitha2210")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/amitha2210.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/amitha2210.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=amitha2210&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3Aamitha2210"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GLAD.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gladwintan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gladwintan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/gladwintan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/gladwintan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gladwintan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3Agladwintan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE .. HUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/BlazeChron"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("BlazeChron")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/blazechron.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/blazechron.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=blazechron&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3ABlazeChron"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YOU ..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Slipperybara"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Slipperybara")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/slipperybara.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/slipperybara.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slipperybara&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3ASlipperybara"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN..NHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jinhanjinhan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jinhanjinhan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-2.github.io/tp/images/jinhanjinhan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-2.github.io/tp/team/jinhanjinhan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jinhanjinhan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-2/tp/pulls?q=is%3Apr+author%3Ajinhanjinhan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-3-edumanage"}},[_v("CS2103T-W08-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduManage]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-3-edumanage","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTuition teachers. Grace, a 35-year-old experienced tuition teacher, juggles managing multiple classes and student details across different subjects. She often struggles to keep track of each student's progress, lesson, and specific learning needs, resulting in a lack of personalized attention during lessons.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEduManage provides a robust and intuitive platform for tuition teachers to manage student information efficiently. Optimized for those who prefer a fast, typing-based interface, it offers powerful tools for tracking student progress and lessons, ensuring that teachers can deliver customized learning experiences while maintaining strong connections with their students.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/11WVLSJ-gmkMSVZBulD32zuu4OT0KyHq5gNBcrNheeEE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("EYU ..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/EyuGongYi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("EyuGongYi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/eyugongyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/eyugongyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=eyugongyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3AEyuGongYi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..THAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/EthanLoww"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("EthanLoww")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/ethanloww.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/ethanloww.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethanloww&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3AEthanLoww"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIDD..GALA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Siddardar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Siddardar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/siddardar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/siddardar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=siddardar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3ASiddardar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SKYL.. ZEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/skyl3-r"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("skyl3-r")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/skyl3-r.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/skyl3-r.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=skyl3-r&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3Askyl3-r"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THAD..E AN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/foothaddeus"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foothaddeus")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-3.github.io/tp/images/foothaddeus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-3.github.io/tp/team/foothaddeus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=foothaddeus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-3/tp/pulls?q=is%3Apr+author%3Afoothaddeus"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w08-4-goonbook"}},[_v("CS2103T-W08-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W08-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W08-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("GoonBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w08-4-goonbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrimary School Teachers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA streamlined tool designed to simplify classroom management, allowing teachers to effortlessly organize student information, track academic progress, and enhance communication with parents—all within a secure, easy-to-use platform.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1qx_FKm62aor2mPiKXBL--gqbAb0bY5ibzaNDMa_Bfus/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BEH .. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wenjebs"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wenjebs")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/wenjebs.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/wenjebs.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wenjebs&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Awenjebs"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MART..N NG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/martout2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("martout2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/martout2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/martout2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=martout2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Amartout2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHAU..SIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Hoodini231"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Hoodini231")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/hoodini231.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/hoodini231.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hoodini231&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3AHoodini231"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SONG..HYUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hyxnnii"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hyxnnii")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/hyxnnii.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/hyxnnii.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hyxnnii&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Ahyxnnii"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YIM ..BING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yimjianbing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yimjianbing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W08-4.github.io/tp/images/yimjianbing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W08-4.github.io/tp/team/yimjianbing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yimjianbing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W08-4/tp/pulls?q=is%3Apr+author%3Ayimjianbing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w09"}},[_v("CS2103T-W09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-1-hiredfiredpro"}},[_v("CS2103T-W09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HiredFiredPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-1-hiredfiredpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInterviewers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTo be able to quickly identify potential candidates based on their skills and passed interview stages. Interviewers can also quickly identify those with more experience or those who have a high interview score. Interviewee status is displayed along with relevant position details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1AL-ENlH8iL_K3LntiQeSGzJyOVgDMsroufbpVdtgpyk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ADIB..ENDY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bigismols"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bigismols")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/bigismols.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/bigismols.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bigismols&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3Abigismols"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DERR.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LemonDrew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LemonDrew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/lemondrew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/lemondrew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lemondrew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3ALemonDrew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KUSH.. DAS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kushaldas27"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kushaldas27")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/kushaldas27.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/kushaldas27.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kushaldas27&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3Akushaldas27"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..EWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/oolongwater"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("oolongwater")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/oolongwater.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/oolongwater.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=oolongwater&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3Aoolongwater"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHU ..HIQI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SQ77"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SQ77")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-1.github.io/tp/images/sq77.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-1.github.io/tp/team/sq77.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sq77&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-1/tp/pulls?q=is%3Apr+author%3ASQ77"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-2-edulog"}},[_v("CS2103T-W09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduLog]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-2-edulog","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTyping preferred, single user: Tuition teachers who prefer a typing-based interface and manage their tuition business independently.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReduce the time needed for data entry through efficient shorthands. Simplify the tracking of schedules, student data, and financials. Provide comprehensive reporting features to help manage and grow the tuition business effectively. Enhanced organization and reduced administrative workload. Improved accuracy in tracking and reporting. Efficient data management and entry.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1dDyYxxcIXLh3hifpnzTw_JGkn09HsnKbSZ896spgmpk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH.. SEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/josh1248"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("josh1248")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/josh1248.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/josh1248.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=josh1248&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Ajosh1248"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KIMA..JARI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kimxw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kimxw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/kimxw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/kimxw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kimxw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Akimxw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NATH..SHEW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nathanshew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nathanshew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/nathanshew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/nathanshew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nathanshew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Anathanshew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SULT..KHIL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Timenikhil"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Timenikhil")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/timenikhil.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/timenikhil.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=timenikhil&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3ATimenikhil"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THEO.. LIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/obrona"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("obrona")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-2.github.io/tp/images/obrona.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-2.github.io/tp/team/obrona.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=obrona&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-2/tp/pulls?q=is%3Apr+author%3Aobrona"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-3-hireme"}},[_v("CS2103T-W09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HireMe]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-3-hireme","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNUS students applying for hundreds of internships in their semester break\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNUS students may apply to hundreds of internships over the various semesters. Our CLI application makes it easy and convenient for them to keep track of the companies and status of their applications.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1rVGHfGMRMx83aC37cQ4dj1-loototgEdIz9UZD5J78o/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..YLAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/choaticman"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("choaticman")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/choaticman.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/choaticman.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=choaticman&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3Achoaticman"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIT..AIDU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Raghava-Chittidi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Raghava-Chittidi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/raghava-chittidi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/raghava-chittidi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=raghava-chittidi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3ARaghava-Chittidi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..ELLY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/woke02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("woke02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/woke02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/woke02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=woke02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3Awoke02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU X..TING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/snowstopxt"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("snowstopxt")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/snowstopxt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/snowstopxt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=snowstopxt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3Asnowstopxt"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZWE ..ZEYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ZweZeya"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ZweZeya")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-3.github.io/tp/images/zwezeya.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-3.github.io/tp/team/zwezeya.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zwezeya&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-3/tp/pulls?q=is%3Apr+author%3AZweZeya"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w09-4-dormanagerpro"}},[_v("CS2103T-W09-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W09-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W09-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("DorManagerPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w09-4-dormanagerpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUniversity Dormitory manager (Teacher residents and admins at Dorm Halls)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide fast and centralised access to vital resident information such as their room numbers, roles (e.g. Residential Assistants, Club Managers) and emergency contacts, optimised for dormitory managers who prefer CLIs. Also allows for quick input of details and querying by different conditions for dorm managers of large dorms.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/16EYTVLtzzNR21NZ9eMuhx-zErOA8gGKAKUTxh5Tc_68/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOO..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chashaobao123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chashaobao123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/chashaobao123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/chashaobao123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chashaobao123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3Achashaobao123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HE S.. SHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lancehaha"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lancehaha")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/lancehaha.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/lancehaha.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lancehaha&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3Alancehaha"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI Y..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/charlesliyifeng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("charlesliyifeng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/charlesliyifeng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/charlesliyifeng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=charlesliyifeng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3Acharlesliyifeng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..SUEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SeanFoongjt"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SeanFoongjt")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/seanfoongjt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/seanfoongjt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seanfoongjt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3ASeanFoongjt"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEO .. EDA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/EdaYeo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("EdaYeo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W09-4.github.io/tp/images/edayeo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W09-4.github.io/tp/team/edayeo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=edayeo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W09-4/tp/pulls?q=is%3Apr+author%3AEdaYeo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w10"}},[_v("CS2103T-W10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-1-teacher-s-pet"}},[_v("CS2103T-W10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Teacher’s Pet]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-1-teacher-s-pet","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching assistants who manage students information and need an efficient way to track academic progress, contact details, and other relevant data for each student.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeacher’s Pet streamlines the management of student information by consolidating contact details, grades, and additional pertinent data into one accessible platform. This efficient tool simplifies tracking student performance and communication, enhancing organisational efficiency for teaching assistants.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/19BhXM0_3YqI4gJybXwTxaA_3uHR83LkMIPQHIuE-RCA/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AGAR..SHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ishan-agarwal-05"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ishan-agarwal-05")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/ishan-agarwal-05.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/ishan-agarwal-05.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ishan-agarwal-05&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3Aishan-agarwal-05"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GABR..INGS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gabriellegtw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gabriellegtw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/gabriellegtw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/gabriellegtw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gabriellegtw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3Agabriellegtw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH..KEAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NicholasT1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NicholasT1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/nicholast1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/nicholast1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholast1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3ANicholasT1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WILL..AYAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Wnayar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Wnayar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-1.github.io/tp/images/wnayar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-1.github.io/tp/team/wnayar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wnayar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-1/tp/pulls?q=is%3Apr+author%3AWnayar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-2-doctrack"}},[_v("CS2103T-W10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("DocTrack]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-2-doctrack","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is intended for General Practitioners (GPs) at small clinics who need to keep track of recurring patients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTime spent looking through paper medical documents should be spent in other live-saving activities. Our product resolves this issue by creating fast access to patient contact details as well as their relevant appointment/treatment details, allowing GPs to contact and monitor their patients easily.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1BfedIDMpQ-bFukE8xjMGbNzUoEgmYmP3E7am3cIPs8A/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOI..YEOK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/choiwab"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("choiwab")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/choiwab.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/choiwab.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=choiwab&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Achoiwab"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JO A..O AN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jayjay19630"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jayjay19630")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/jayjay19630.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/jayjay19630.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jayjay19630&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Ajayjay19630"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..SANI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zaidansani"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zaidansani")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/zaidansani.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/zaidansani.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zaidansani&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Azaidansani"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RACH.. JIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rxchell"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rxchell")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/rxchell.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/rxchell.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rxchell&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3Arxchell"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SACH..GMAY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Vangmay"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Vangmay")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-2.github.io/tp/images/vangmay.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-2.github.io/tp/team/vangmay.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vangmay&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-2/tp/pulls?q=is%3Apr+author%3AVangmay"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-3-agentconnect"}},[_v("CS2103T-W10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AgentConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-3-agentconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for insurance agent who wants to keep track of all client details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvides quick and efficient access to client details, tailored for insurance agents who need a streamlined interface to manage contacts, track policy updates, and schedule client follow-ups via CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1vkqziV6U4XH3ECFGYcsYsMWubnQDuxkVCK_RzP3D0cs/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AW M..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MingYiAw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MingYiAw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/mingyiaw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/mingyiaw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mingyiaw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AMingYiAw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DENO..ZONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SSirMentos"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SSirMentos")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/ssirmentos.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/ssirmentos.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ssirmentos&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3ASSirMentos"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("EDWI..HUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Edwin1022"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Edwin1022")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/edwin1022.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/edwin1022.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=edwin1022&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AEdwin1022"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MANT.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/M-kew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("M-kew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/m-kew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/m-kew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=m-kew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AM-kew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG .. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/The0nlyJuan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The0nlyJuan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-3.github.io/tp/images/the0nlyjuan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-3.github.io/tp/team/the0nlyjuan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=the0nlyjuan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-3/tp/pulls?q=is%3Apr+author%3AThe0nlyJuan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w10-4-storeclass"}},[_v("CS2103T-W10-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W10-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W10-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("StoreClass]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w10-4-storeclass","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA teacher in an educational institution with many students to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIt allows for easy and efficient retrieval or storage of student information while providing a clean and user-friendly interface. The application supports modularity, and users are able to import and export to other similar applications. Users will not need to rely on complex or costly software.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1GULAVZHn4ZjgwoqhZkIP2ttCVEGB21o5CT4hg_uf8N4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("COLL..U QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tanyqcollin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tanyqcollin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/tanyqcollin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/tanyqcollin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tanyqcollin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3Atanyqcollin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA.. ZAC")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/isaactodo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("isaactodo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/isaactodo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/isaactodo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=isaactodo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3Aisaactodo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEI ..NWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jianwen0451"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jianwen0451")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/jianwen0451.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/jianwen0451.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jianwen0451&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3AJianwen0451"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..QUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yongqqqq"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yongqqqq")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/yongqqqq.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/yongqqqq.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yongqqqq&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3Ayongqqqq"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEE ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RadieonAjax"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RadieonAjax")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W10-4.github.io/tp/images/radieonajax.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W10-4.github.io/tp/team/radieonajax.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=radieonajax&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W10-4/tp/pulls?q=is%3Apr+author%3ARadieonAjax"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w11"}},[_v("CS2103T-W11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-1-murphy-s-list"}},[_v("CS2103T-W11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Murphy's List]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-1-murphy-s-list","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur target users are administrative assistants for palliative care facilities. Palliative care patients have varying chronic conditions that require different treatments and frequencies of visits. A system is necessary to ensure proper management of patient information, for our target users to easily access and disseminate information to the right personnel.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur CLI-based application offers efficient text-based navigation and access to patient data, allowing the quick retrieval and logging of critical patient information. With an intuitive (and potentially customizable) command structure, it streamlines data management and enhances the visualisation of patient conditions and routines under the facility.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1TEZfBfEkIeLyWPB541WOF7XvF1_-D3zP7yILwgyDeuc/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DOMI..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Dominic-Khoo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Dominic-Khoo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/dominic-khoo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/dominic-khoo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dominic-khoo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3ADominic-Khoo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HO C..RMAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/itsnotsherm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("itsnotsherm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/itsnotsherm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/itsnotsherm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itsnotsherm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Aitsnotsherm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..TONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lim-jt"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lim-jt")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/lim-jt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/lim-jt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lim-jt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Alim-jt"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("REID.. ONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/reidenong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reidenong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/reidenong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/reidenong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=reidenong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Areidenong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/volleyballkickedme"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("volleyballkickedme")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/images/volleyballkickedme.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-1a.github.io/tp/team/volleyballkickedme.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=volleyballkickedme&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-1a/tp/pulls?q=is%3Apr+author%3Avolleyballkickedme"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-2-ab3-my-guest"}},[_v("CS2103T-W11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AB3-My-Guest]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-2-ab3-my-guest","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWedding planners\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAB3-My-Guest centralises guest information for wedding planners. It will help manage the contact details and RSVP status of a small number of invitees (only one wedding event at once). It reduces time taken for wedding planners to filter and contact the invitees, allowing them to focus on the wedding programme.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1zPRaAkgmsifjICHYZOyPwT8zvQK4JcoSZXpHYLdOKMg/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW..HONN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zeonchew0324"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zeonchew0324")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/zeonchew0324.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/zeonchew0324.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zeonchew0324&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Azeonchew0324"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW..RMAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SherChew27"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SherChew27")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/sherchew27.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/sherchew27.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sherchew27&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3ASherChew27"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HARI..ZLAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/harithh07"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("harithh07")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/harithh07.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/harithh07.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=harithh07&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Aharithh07"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOH .. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jiaxinnns"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jiaxinnns")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/jiaxinnns.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/jiaxinnns.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiaxinnns&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Ajiaxinnns"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..AVAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kvernnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kvernnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-2.github.io/tp/images/kvernnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-2.github.io/tp/team/kvernnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kvernnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-2/tp/pulls?q=is%3Apr+author%3Akvernnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-3-academyassist"}},[_v("CS2103T-W11-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AcademyAssist]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-3-academyassist","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for user who work in Management Team of Small Tuition Centre of Primary School Children that has a lot of staff and student details to keep track of\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe specialized contact book for managing a tuition center solves the problem of disorganized student and parent information. It centralizes contact details, tracks student data such as age, class, and tuition fees, maintains a teacher directory, and offers functions that improve administrative efficiency and organization.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ctmZ1AX0uewAxyaZBUav-L6cqo3cKI8AkWCyHEhwGs8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON.. JIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/cweijin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cweijin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/cweijin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/cweijin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cweijin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Acweijin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HING..XING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JoanneHing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JoanneHing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/joannehing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/joannehing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=joannehing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3AJoanneHing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KHOO..YIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/annabellekk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("annabellekk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/annabellekk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/annabellekk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=annabellekk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Aannabellekk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..RIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/adriantan101"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("adriantan101")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/adriantan101.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/adriantan101.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=adriantan101&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Aadriantan101"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..THAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ethanwangkangen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ethanwangkangen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-3.github.io/tp/images/ethanwangkangen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-3.github.io/tp/team/ethanwangkangen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethanwangkangen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-3/tp/pulls?q=is%3Apr+author%3Aethanwangkangen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w11-4-physiopal"}},[_v("CS2103T-W11-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W11-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W11-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PhysioPal]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w11-4-physiopal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPhysiotherapists with a large client base who prefer typing over other means of input, thus require an organised system to manage the details of the clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA cost-effective, customisable solution for managing patient contacts, scheduling appointments, tracking treatment history, and generating health progress reports, all without subscription or licensing fees. It saves time, money, and manpower on repetitive tasks, allowing flexibility to tailor the address book to specific needs.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/15AnFMT_zHZRNNbjhRKWpijDrz_K-yvBVzghELigwnPU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BHUD..ANIT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JumpyJay"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JumpyJay")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/jumpyjay.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/jumpyjay.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jumpyjay&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3AJumpyJay"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..A YE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jiayr99"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jiayr99")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/jiayr99.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/jiayr99.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiayr99&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3Ajiayr99"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIN ..MINE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jasmiinee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jasmiinee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/jasmiinee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/jasmiinee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jasmiinee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3Ajasmiinee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("REN ..PENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/GuanpengR"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GuanpengR")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/guanpengr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/guanpengr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=guanpengr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3AGuanpengR"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SARA..I EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sarahteonin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sarahteonin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W11-4.github.io/tp/images/sarahteonin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W11-4.github.io/tp/team/sarahteonin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sarahteonin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W11-4/tp/pulls?q=is%3Apr+author%3Asarahteonin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w12"}},[_v("CS2103T-W12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-1-blitzbiz"}},[_v("CS2103T-W12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BlitzBiz]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-1-blitzbiz","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSmall business owners, sole proprietorships (e.g. home bakeries, crochet makers, home based nail services, private tutors, etc)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSince these businesses are single-individual teams, keeping track of different stakeholders alone is a hassle. These individuals work on their computers at least for their networking purposes, making the product compatible with their existing workflows. The product is an easy-to-use contact management app that manages customers, business partners and suppliers.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Lz_cMygknQ8aact2zBQqGp81PY8BNzwbCXAlMVEh1-g/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIU ..UJIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LiuYJ2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LiuYJ2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/liuyj2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/liuyj2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=liuyj2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3ALiuYJ2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..A EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jiaaaaen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jiaaaaen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/jiaaaaen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/jiaaaaen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiaaaaen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3Ajiaaaaen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yiiilonggg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yiiilonggg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/yiiilonggg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/yiiilonggg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yiiilonggg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3Ayiiilonggg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZON .. HUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zlch"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zlch")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-1.github.io/tp/images/zlch.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-1.github.io/tp/team/zlch.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zlch&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-1/tp/pulls?q=is%3Apr+author%3Azlch"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-2-volunteams"}},[_v("CS2103T-W12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Volunteams]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-2-volunteams","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNonprofits and Community Organizations\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nit helps to track volunteer hours, donor information and donations. it can also help to organise events, send invites, manage RSVPs, and enable bulk messaging to different groups\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1yTd_OrZnNOPDNbuhetN6YV8RH6wS0pMMnamC1O73d-A/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KAN ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Fluffykan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Fluffykan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/fluffykan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/fluffykan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fluffykan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3AFluffykan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KEER..THIK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/keerthigkaarthik"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("keerthigkaarthik")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/keerthigkaarthik.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/keerthigkaarthik.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=keerthigkaarthik&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3Akeerthigkaarthik"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JovenSoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JovenSoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/jovensoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/jovensoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jovensoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3AJovenSoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TSEN.. CHE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ttzuche"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ttzuche")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/ttzuche.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/ttzuche.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ttzuche&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3Attzuche"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TSEN..U EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tzuennn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tzuennn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-2.github.io/tp/images/tzuennn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-2.github.io/tp/team/tzuennn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tzuennn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-2/tp/pulls?q=is%3Apr+author%3Atzuennn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-3-unilink"}},[_v("CS2103T-W12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("UniLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-3-unilink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUniversity students\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUniversity students meet people from many different places (e.g. different classes, CCAs, student accommodation, etc). As such, they often have too many contacts that are hard to keep track of. Thus, we hope to make it easier to categorise and find contacts when they need them.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1aNFfc9-PAKCXNOm1KXwOFXF2136rAl1JHg1Prx5V08c/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMEL..LENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/achl1012"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("achl1012")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/achl1012.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/achl1012.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=achl1012&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Aachl1012"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG ..N XU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zienxu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zienxu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/zienxu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/zienxu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zienxu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Azienxu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JERE..N AN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jtooya"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jtooya")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/jtooya.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/jtooya.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jtooya&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Ajtooya"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..U QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kimberlytmq"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kimberlytmq")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/kimberlytmq.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/kimberlytmq.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kimberlytmq&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3Akimberlytmq"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAP ..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SlothyCat"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SlothyCat")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-3.github.io/tp/images/slothycat.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-3.github.io/tp/team/slothycat.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slothycat&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-3/tp/pulls?q=is%3Apr+author%3ASlothyCat"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w12-4-talenthub"}},[_v("CS2103T-W12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TalentHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w12-4-talenthub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCelebrity talent managers who prefer CLI over GUI and have a lot of clients to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe address book offers celebrity managers a secure, offline tool to manage various contacts and stakeholders, track VIP relationships, and schedule events efficiently. With a customizable field, it streamlines coordination while ensuring privacy and data control in a high-stakes environment.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1AJNKqSXt7Dsx_jpFpfZm6jtwSned0_g6lr_fDoIBmxQ/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HARI..RFAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Haris-Irfan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Haris-Irfan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/haris-irfan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/haris-irfan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=haris-irfan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3AHaris-Irfan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HENG.. SIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/fusin02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("fusin02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/fusin02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/fusin02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fusin02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Afusin02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QIU ..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jhqiu21"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jhqiu21")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/jhqiu21.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/jhqiu21.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jhqiu21&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Ajhqiu21"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..THAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seantham21"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seantham21")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/seantham21.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/seantham21.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seantham21&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Aseantham21"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..IJIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wrjgold"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wrjgold")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W12-4.github.io/tp/images/wrjgold.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W12-4.github.io/tp/team/wrjgold.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wrjgold&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W12-4/tp/pulls?q=is%3Apr+author%3Awrjgold"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w13"}},[_v("CS2103T-W13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-1-cher"}},[_v("CS2103T-W13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Cher]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-1-cher","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrivate school teachers, educators.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nValue Proposition: Simplifies contact management by providing an all-in-one user-friendly interface for teachers or educators in education institutions. Ease their pain of manually tracking things like attendance and parents/students’ contact.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1WC9jrIkqofsdF-KovNYC6hTZz7aeBJ-hUH7U7p31LDU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HALE..RFAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/haleemairfan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("haleemairfan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/haleemairfan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/haleemairfan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=haleemairfan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Ahaleemairfan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI Y..UEYI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yyueyii"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yyueyii")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/yyueyii.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/yyueyii.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yyueyii&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Ayyueyii"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PAIN..KYAW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MinkhantEain"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MinkhantEain")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/minkhanteain.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/minkhanteain.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=minkhanteain&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3AMinkhantEain"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VARA..HUNA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/miuna9890"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("miuna9890")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/miuna9890.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/miuna9890.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=miuna9890&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Amiuna9890"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHOU..NGYE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zhou-colla"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zhou-colla")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-1.github.io/tp/images/zhou-colla.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-1.github.io/tp/team/zhou-colla.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zhou-colla&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-1/tp/pulls?q=is%3Apr+author%3Azhou-colla"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-2-careconnect"}},[_v("CS2103T-W13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CareConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-2-careconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nBusy social workers providing community case management services at local social service agencies. Their role involves the need to keep track of, and follow up with multiple assigned clients, each with varying needs and requirements.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA CLI-first case management application that enables social workers to efficiently manage client details, appointments, and priorities. Repeated chores including data entry and search will be streamlined via simple CLI inputs, easing the mental load of the social workers, allowing them to focus more on delivering high-quality care and support.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1lho7NQmFLiS3lKv8If6wzyVpNCIvDIqQeO6m2wC3BAY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAI..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/celeschai"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("celeschai")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/celeschai.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/celeschai.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=celeschai&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3Aceleschai"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUHA..LOYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SuhailLoya"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SuhailLoya")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/suhailloya.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/suhailloya.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=suhailloya&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3ASuhailLoya"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mongj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mongj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/mongj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/mongj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mongj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3Amongj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN.. JEM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AppleJem"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AppleJem")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-2.github.io/tp/images/applejem.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-2.github.io/tp/team/applejem.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=applejem&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-2/tp/pulls?q=is%3Apr+author%3AAppleJem"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-3-mindmap"}},[_v("CS2103T-W13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MindMap]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-3-mindmap","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPsychologists and Psychiatrists who rely on their computers for managing patient records, session notes, and administrative tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvides an efficient way for psychologists and psychiatrists to log patient information and session details with minimal disruption. The CLI-based approach prioritizes quick data entry and organization while maintaining privacy by storing data locally, addressing the need for secure, fuss-free patient record management during sessions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/127pClz2cUOx_6aXMIsdt14z5zXBOHv7rwqu6CLt82TY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zhiyi12345"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zhiyi12345")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/zhiyi12345.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/zhiyi12345.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zhiyi12345&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Azhiyi12345"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LER ..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/junyi73"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("junyi73")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/junyi73.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/junyi73.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=junyi73&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Ajunyi73"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Z.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/slidings"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("slidings")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/slidings.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/slidings.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slidings&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Aslidings"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jeanyang04"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jeanyang04")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/jeanyang04.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/jeanyang04.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jeanyang04&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3Ajeanyang04"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH ..HUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/t-leongchuan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("t-leongchuan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-3.github.io/tp/images/t-leongchuan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-3.github.io/tp/team/t-leongchuan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=t-leongchuan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-3/tp/pulls?q=is%3Apr+author%3At-leongchuan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w13-4-knottyplanners"}},[_v("CS2103T-W13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("KnottyPlanners]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w13-4-knottyplanners","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWedding planner who types fast and prefers using a command-line interface (CLI) over graphical inputs. They handle contact management, event coordination, and logistics.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWe solve the problem of slow and inefficient contact management and event coordination for wedding planners. By providing fast access to client and vendor details, it is optimised for planners who need to search through a large stack of contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ceSmpUGD0e9zGZM8S7yu-yn6NZCOZu7HYOVJrQYUIYw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("IZZA..SHAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ywllowsensor"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ywllowsensor")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/ywllowsensor.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/ywllowsensor.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ywllowsensor&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Aywllowsensor"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JONU.. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jonushzw"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jonushzw")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/jonushzw.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/jonushzw.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jonushzw&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Ajonushzw"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI S..IRUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/siriousguy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("siriousguy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/siriousguy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/siriousguy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=siriousguy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Asiriousguy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YASW..LURI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yastsc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yastsc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/yastsc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/yastsc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yastsc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Ayastsc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHOU..ZIBO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zzibo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zzibo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W13-4.github.io/tp/images/zzibo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W13-4.github.io/tp/team/zzibo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zzibo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W13-4/tp/pulls?q=is%3Apr+author%3Azzibo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-w14"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-w14"}},[_v("CS2103T-W14"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-1-vendorvault"}},[_v("CS2103T-W14-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("VendorVault]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-1-vendorvault","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for grocers who have to interact and confirm orders with multiple suppliers and customers constantly\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n- Stores can have multiple suppliers, it is difficult to keep track of who to contact for a particular good - Supplier’s contact can be tagged with the level of inventory in the store, allowing grocers to call suppliers quickly when stocks are low - Grocers can also coordinate grocery deliveries to customers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1QB0nUKadPegmiz9kScgPoXHZJx-ffY-KGFqG9bXx6ow/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..NZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/CJianzhi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CJianzhi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/cjianzhi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/cjianzhi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cjianzhi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3ACJianzhi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KART..MAAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/prave1n"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("prave1n")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/prave1n.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/prave1n.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=prave1n&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3Aprave1n"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KRIS..ARUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LinkesV"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LinkesV")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/linkesv.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/linkesv.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=linkesv&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3ALinkesV"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG J..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ngjianyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ngjianyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/ngjianyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/ngjianyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ngjianyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3Angjianyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VINC..YONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/vinc3leong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("vinc3leong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-1.github.io/tp/images/vinc3leong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-1.github.io/tp/team/vinc3leong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vinc3leong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-1/tp/pulls?q=is%3Apr+author%3Avinc3leong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-2-ba"}},[_v("CS2103T-W14-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BA€]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-2-ba","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSalespeople that make recurring sales\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nConsolidates information about clients from multiple sources. Provides an overview of all clients and offers options to visualise information about specific client groups, especially those that they need to prioritise to optimise their sales\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Zj4AcaHIi3spj0clSS5UK7yU3gYFMTxw0l8kI4Jfa8A/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ARVI..AJAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DiegoTheExplorar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DiegoTheExplorar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/diegotheexplorar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/diegotheexplorar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=diegotheexplorar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3ADiegoTheExplorar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HAN ..NTIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/valhrd"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("valhrd")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/valhrd.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/valhrd.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=valhrd&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3Avalhrd"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/frymash"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("frymash")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/frymash.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/frymash.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=frymash&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3Afrymash"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RYAN.. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RyanWarwick"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RyanWarwick")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/ryanwarwick.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/ryanwarwick.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ryanwarwick&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3ARyanWarwick"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SNOD..ETER")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/appleshill"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("appleshill")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-2.github.io/tp/images/appleshill.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-2.github.io/tp/team/appleshill.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=appleshill&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-2/tp/pulls?q=is%3Apr+author%3Aappleshill"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-3-hall-pointer"}},[_v("CS2103T-W14-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Hall Pointer]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-3-hall-pointer","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCCA Leaders in NUS Hall\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHall Pointer empowers CCA leaders in NUS Halls to efficiently manage member tracking by streamlining participation recording, points allocation, and room addresses. It simplifies manual data management, enabling leaders to focus on organizing activities rather than administrative tasks. Ideal for small, close-knit CCAs, it ensures quick access to updated information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Lb8pp6hqFPvNjbclFUGlxWXDWN37EmqtPC6u5DInjvI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LAI ..NIEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/starchypotatocode"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("starchypotatocode")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/starchypotatocode.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/starchypotatocode.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=starchypotatocode&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Astarchypotatocode"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG ..EITH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/keithxun"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("keithxun")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/keithxun.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/keithxun.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=keithxun&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Akeithxun"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QIN ..CHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/QinHaichen12"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("QinHaichen12")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/qinhaichen12.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/qinhaichen12.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=qinhaichen12&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3AQinHaichen12"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/taggyhan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("taggyhan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/taggyhan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/taggyhan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=taggyhan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Ataggyhan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YUVR..INGH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yuvrajaryan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yuvrajaryan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-3.github.io/tp/images/yuvrajaryan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-3.github.io/tp/team/yuvrajaryan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yuvrajaryan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-3/tp/pulls?q=is%3Apr+author%3Ayuvrajaryan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-w14-4-eventfulnus"}},[_v("CS2103T-W14-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-W14-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-W14-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EventfulNUS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-w14-4-eventfulnus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSports Event (e.g. IFG) Organiser that needs to manage and contact: Audience, Athletes, Committee Members, Referees, Photography. This person prefers CLI over GUI and has many event participants to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAll event organizers will be able to: a) View what kind of participant each contact is in the application is without having to dig through paperwork / NUSync b) View how participants are grouped by membership (e.g. faculty sports team) without having to dig through paperwork / NUSync c) Track the particular participant’s involvement in the event’s sub-events (e.g. IFG has multiple sub-events that stakeholders can take part in) without having to dig through paperwork / NUSync\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1NkW50U7mpYOSGXb_wfhzEDSwrPRHWlvO3Mm7u02xcps/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AARO.. SIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Peanuts359"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Peanuts359")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/peanuts359.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/peanuts359.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=peanuts359&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3APeanuts359"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEW..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bryanjhc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bryanjhc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/bryanjhc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/bryanjhc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bryanjhc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Abryanjhc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FAN ..OLIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaoxi998533"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaoxi998533")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/kaoxi998533.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/kaoxi998533.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaoxi998533&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Akaoxi998533"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PARK..GSEO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/youngseopark05"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("youngseopark05")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/youngseopark05.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/youngseopark05.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=youngseopark05&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Ayoungseopark05"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WOLF..ARDO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leowolf275"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leowolf275")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-W14-4.github.io/tp/images/leowolf275.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-W14-4.github.io/tp/team/leowolf275.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leowolf275&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-W14-4/tp/pulls?q=is%3Apr+author%3Aleowolf275"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t08"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t08"}},[_v("CS2103T-T08"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-1-dltbook"}},[_v("CS2103T-T08-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("DLTbook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-1-dltbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCS students interested in using stablecoins for transactions\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor NUS CS Students who use Crypto for transactions dissatisfied with the hassle of tracking public addresses manually due to high complexity of manually doing so, DLTbook offers a DLT public address tracking platform that aggregates this data\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1-eEmDVd3T_eh3xNhoEUe_RiBDeNu-40B9DFn50pT1tk/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALEX..ANDY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Airiinnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Airiinnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/airiinnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/airiinnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=airiinnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3AAiriinnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON..ZHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chongtzezhao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chongtzezhao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/chongtzezhao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/chongtzezhao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chongtzezhao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3Achongtzezhao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nicholascyx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nicholascyx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/nicholascyx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/nicholascyx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholascyx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3ANicholascyx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIM ..AVIS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/travisim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("travisim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/travisim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/travisim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=travisim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3Atravisim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TheRareFox"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TheRareFox")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-1.github.io/tp/images/therarefox.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-1.github.io/tp/team/therarefox.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=therarefox&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-1/tp/pulls?q=is%3Apr+author%3ATheRareFox"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-2-keycontacts"}},[_v("CS2103T-T08-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("KeyContacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-2-keycontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHome piano tutors\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nToo many groups and students to keep track of, including what pieces they are learning, what time their session is, what grade they are currently, whether the class is a theory class or practical class etc.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/12OH5vGb3r7hOeilAjC5u9e9ZIrueOzxD4Homn65me2M/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AUDI..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/audipras"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("audipras")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/audipras.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/audipras.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=audipras&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Aaudipras"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bryancheny"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bryancheny")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/bryancheny.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/bryancheny.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bryancheny&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Abryancheny"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/IzN432"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("IzN432")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/izn432.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/izn432.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=izn432&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3AIzN432"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KIM ..YEOK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zzawook"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zzawook")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/zzawook.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/zzawook.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zzawook&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Azzawook"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..DAVE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dwsc37"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dwsc37")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-2.github.io/tp/images/dwsc37.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-2.github.io/tp/team/dwsc37.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dwsc37&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-2/tp/pulls?q=is%3Apr+author%3Adwsc37"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-3-meddict"}},[_v("CS2103T-T08-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MedDict]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-3-meddict","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPhysiotherapists\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide a more specialised one-stop-for-all medical related information to physiotherapists' patients, schedules, appointments and to keep track of patients' medical information, progression, medical history etc. Optimized for physiotherapists who may have to keep close track of all their patients’ detailed progress, whilst having to juggle with having many patients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1LZNigqwbME4LP_1AR6YL4q_EGWK5Bmy-BHiCZ4kBco0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AXEL..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shinichi04"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shinichi04")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/shinichi04.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/shinichi04.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shinichi04&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Ashinichi04"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..IHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chengzihao123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chengzihao123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/chengzihao123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/chengzihao123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chengzihao123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Achengzihao123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NIGE.. YOU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nigeltzy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nigeltzy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/nigeltzy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/nigeltzy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nigeltzy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3ANigeltzy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAND..LUYO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sandyk0105"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sandyk0105")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/sandyk0105.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/sandyk0105.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sandyk0105&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Asandyk0105"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THAM..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tyxiangs"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tyxiangs")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-3.github.io/tp/images/tyxiangs.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-3.github.io/tp/team/tyxiangs.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tyxiangs&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-3/tp/pulls?q=is%3Apr+author%3Atyxiangs"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t08-4-tahub"}},[_v("CS2103T-T08-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T08-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T08-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t08-4-tahub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching assistants in university-level courses managing students contacts\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAHub simplifies the management of student information, providing organized data management for teaching assistants who need efficient, accurate tools for tracking attendance, grades, and participation.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1F-tIBE-hXjc3OpZ8GIvhpLu0XOq91lKnxewlOySBKY0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALBE..UTRA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hpcman"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hpcman")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/hpcman.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/hpcman.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hpcman&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Ahpcman"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DOMI.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dominopizzaaaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dominopizzaaaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/dominopizzaaaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/dominopizzaaaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dominopizzaaaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Adominopizzaaaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUAN..IERI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/juancarlovieri"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("juancarlovieri")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/juancarlovieri.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/juancarlovieri.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=juancarlovieri&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Ajuancarlovieri"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAFA..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/izruff"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("izruff")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/izruff.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/izruff.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=izruff&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3Aizruff"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RIVE.. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Oceankoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Oceankoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T08-4.github.io/tp/images/oceankoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T08-4.github.io/tp/team/oceankoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=oceankoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T08-4/tp/pulls?q=is%3Apr+author%3AOceankoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t09"}},[_v("CS2103T-T09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-1-internbuddy"}},[_v("CS2103T-T09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("InternBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-1-internbuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for university students majoring in Computer Science, specifically those seeking summer internships. They are typically busy with assignments while applying for summer internships. As a result, they may lose track of key information about companies they have applied for in a constantly increasing list of applications made.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInternBuddy aims to simplify and efficiently manage internship application details, optimised for fast typers who prefer a CLI interface. It enables users to track key information such as HR contacts, interview dates, and application statuses, all while maintaining portability across multiple operating systems without requiring a remote server.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/18DnZEyYiCFxt_Ajr6h_bGZwW8NYn5JeZz8Yt1XOGvDw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG .. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/realqijun"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("realqijun")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/realqijun.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/realqijun.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=realqijun&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Arealqijun"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOH ..ESON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/blanklogic"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("blanklogic")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/blanklogic.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/blanklogic.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=blanklogic&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Ablanklogic"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..RWIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/meerkatboy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("meerkatboy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/meerkatboy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/meerkatboy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=meerkatboy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Ameerkatboy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TONG..IMON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/uniqly"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("uniqly")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/uniqly.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/uniqly.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=uniqly&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3Auniqly"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VARU..UKLA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Shux347"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Shux347")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-1.github.io/tp/images/shux347.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-1.github.io/tp/team/shux347.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shux347&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-1/tp/pulls?q=is%3Apr+author%3AShux347"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-2-talentsg"}},[_v("CS2103T-T09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TalentSG]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-2-talentsg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur primary target users are Recruiters and HR professionals who are responsible for managing job candidates and employee information. These users typically work in fast-paced environments where efficient management of candidate and employee data is crucial for streamlining the recruitment process and ensuring organisational growth.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTalentSG aims to simplify and enhance the recruitment process for HR professionals and recruiters. The application will provide robust features for tracking applicants, managing interview schedules, and maintaining comprehensive records of employment details. By centralising these tasks in one intuitive platform, TalentSG will help users to make better hiring decisions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1701xNBt2jjcBjT-n1O5RbFzOO3rtK9tOxmZWL6rYgW4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH..ITYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thisisaditya17"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thisisaditya17")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/thisisaditya17.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/thisisaditya17.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thisisaditya17&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Athisisaditya17"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEI ..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dominic2412"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dominic2412")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/dominic2412.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/dominic2412.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dominic2412&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Adominic2412"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SARA..HANI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rithanisk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rithanisk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/rithanisk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/rithanisk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rithanisk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Arithanisk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TANG..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/stanleytangzh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("stanleytangzh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/stanleytangzh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/stanleytangzh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=stanleytangzh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3Astanleytangzh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TUNG.. ZUO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Darren-Tung"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Darren-Tung")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-2.github.io/tp/images/darren-tung.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-2.github.io/tp/team/darren-tung.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=darren-tung&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-2/tp/pulls?q=is%3Apr+author%3ADarren-Tung"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-3-medicontacts"}},[_v("CS2103T-T09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MediContacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-3-medicontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for receptionists at a private clinic who prefer CLI over GUI and have to deal with numerous patients' records and staff particulars while being visually organised.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables users to efficiently keep track of relevant personnel in the clinic (patients, referring doctors, suppliers, and other healthcare providers), arrange appointments between relevant parties, and analyse and group various information from the patients' records.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/11QvqzXhNOlaU52bmu35PEtUVE9rx0z3DtIwvzwefhkU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BRAN..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MiloTruck"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MiloTruck")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/milotruck.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/milotruck.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=milotruck&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3AMiloTruck"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chiangqinkang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chiangqinkang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/chiangqinkang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/chiangqinkang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chiangqinkang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Achiangqinkang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MA C..RIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bmanara"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bmanara")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/bmanara.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/bmanara.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bmanara&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Abmanara"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU.. LEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sam-theman88"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sam-theman88")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/sam-theman88.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/sam-theman88.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sam-theman88&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Asam-theman88"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THNG..ANIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/taniathng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("taniathng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-3.github.io/tp/images/taniathng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-3.github.io/tp/team/taniathng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=taniathng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-3/tp/pulls?q=is%3Apr+author%3Ataniathng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t09-4-goats-greatest-online-address-book-for-tutoring-students"}},[_v("CS2103T-T09-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T09-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T09-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("GOATS - Greatest Online Address-book for Tutoring Students]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t09-4-goats-greatest-online-address-book-for-tutoring-students","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrivate tutors, who may have students studying at different levels.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTutors find it challenging to keep track of student information if they are teaching multiple students. They could be juggling additional administrative duties with their teaching duties. GOATS can enhance their efficiency by managing student and parent data, freeing up their time and allowing them to focus on other tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/16EoNCO_IdY5ja4ZzoW2JvI1XcHMrLokmLKfw34qQuiI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..CHIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ckclion"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ckclion")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/ckclion.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/ckclion.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ckclion&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3Ackclion"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DING..I HE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/oneBoz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("oneBoz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/oneboz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/oneboz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=oneboz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3AoneBoz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/IsaacPangTH"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("IsaacPangTH")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/isaacpangth.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/isaacpangth.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=isaacpangth&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3AIsaacPangTH"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LUTF..IZAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lutfir-cpu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lutfir-cpu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/lutfir-cpu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/lutfir-cpu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lutfir-cpu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3Alutfir-cpu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TANG..LIOT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/elliot-tang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("elliot-tang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T09-4.github.io/tp/images/elliot-tang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T09-4.github.io/tp/team/elliot-tang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=elliot-tang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T09-4/tp/pulls?q=is%3Apr+author%3Aelliot-tang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t10"}},[_v("CS2103T-T10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-1-medicontact"}},[_v("CS2103T-T10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MediContact]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-1-medicontact","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAdministrative staff at a GP clinic responsible for patient management. They should be apt with technology and trained to be familiar with the software as their primary job.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPatient / Contact management systems might be outdated in GP clinics, introducing MediContact might improve user-friendliness. MediContact also centralizes the details of patients at the clinic with a command line interface to enable efficient contact between patient and clinic. Furthermore, it can provide easy categorisation and filtering of patients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1_XXT8HknGxYRj-kGVicz_oyMwtfKL16cxcdSxwQmNN0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AGAR..ITVI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ritvi12"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ritvi12")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/ritvi12.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/ritvi12.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ritvi12&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3Aritvi12"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KELL..A QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Bonzzz3"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bonzzz3")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/bonzzz3.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/bonzzz3.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bonzzz3&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3ABonzzz3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LYNE..YING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LynetteLeeSiYing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LynetteLeeSiYing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/lynetteleesiying.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/lynetteleesiying.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lynetteleesiying&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3ALynetteLeeSiYing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NASY..JAYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/myrilla12"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("myrilla12")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/myrilla12.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/myrilla12.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=myrilla12&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3Amyrilla12"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..OTTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/OttoTan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("OttoTan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-1.github.io/tp/images/ottotan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-1.github.io/tp/team/ottotan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ottotan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-1/tp/pulls?q=is%3Apr+author%3AOttoTan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-2-staffsync"}},[_v("CS2103T-T10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("StaffSync]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-2-staffsync","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for Human Resources (HR) Managers that have a lot of potential candidates with a set of skills looking for a spot in their company.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product will provide fast access to potential candidates details, and is able to match candidates with available job openings quickly by looking at their details collected. It will also allow our user to look at a list of updated potential candidates if their contract is over.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/15pEtxfHfaqvuAZcJUX8ER2mpo2idkPDc0nj8ECQhqFs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CAI ..NZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thortol"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thortol")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/thortol.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/thortol.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thortol&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3Athortol"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JEVA..I EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jevan13"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jevan13")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/jevan13.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/jevan13.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jevan13&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3Ajevan13"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..NEST")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LimErnest"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LimErnest")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/limernest.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/limernest.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limernest&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3ALimErnest"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NEO .. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KiKuasaurus"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KiKuasaurus")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/kikuasaurus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/kikuasaurus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kikuasaurus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3AKiKuasaurus"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("POH ..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/InfinityTwo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("InfinityTwo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-2.github.io/tp/images/infinitytwo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-2.github.io/tp/team/infinitytwo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=infinitytwo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-2/tp/pulls?q=is%3Apr+author%3AInfinityTwo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-3-tasync"}},[_v("CS2103T-T10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TASync]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-3-tasync","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNus CS TAs who are adept and prefer CLI over GUI, and have to keep track of their tutorial students’ contact and progress.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOffers a streamlined tool for TAs to efficiently manage student contacts and work progress, optimized for users who are fast typers, it’s portable, battery-efficient(light-weight), easy to learn and use.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1WbwSlaBfDzHhQFy-aBEbz-v7sd1BS6tPtSSe8BXh8UE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CLIF..KOES")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Domokunx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Domokunx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/domokunx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/domokunx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=domokunx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3ADomokunx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DARY..BOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DKHB0207"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DKHB0207")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/dkhb0207.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/dkhb0207.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dkhb0207&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3ADKHB0207"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GARE..ARNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/raageth"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("raageth")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/raageth.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/raageth.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=raageth&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3Araageth"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAY ..LENN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sayglenn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sayglenn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/sayglenn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/sayglenn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sayglenn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3Asayglenn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yockcheng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yockcheng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-3.github.io/tp/images/yockcheng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-3.github.io/tp/team/yockcheng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yockcheng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-3/tp/pulls?q=is%3Apr+author%3Ayockcheng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t10-4-legacylink"}},[_v("CS2103T-T10-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T10-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T10-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("LegacyLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t10-4-legacylink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for users with big families and has to manage lots of contacts to plan for family events.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nBig family trees are difficult to keep track of. Our product allows users who have big families to keep track of family members, relatives and in-laws’ contacts and update it easily when it changes.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Gdu5kCJ806V9OOP29Siepyo26ImhT_a6kFf5_zJkBRs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ASVE..ASAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ashea10"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ashea10")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/ashea10.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/ashea10.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ashea10&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Aashea10"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GILB..NDAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Gilbb"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gilbb")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/gilbb.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/gilbb.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gilbb&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3AGilbb"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GORA..HANK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shadhankkk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shadhankkk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/shadhankkk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/shadhankkk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shadhankkk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Ashadhankkk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MARC.. LIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/marchjlim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("marchjlim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/marchjlim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/marchjlim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=marchjlim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Amarchjlim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MICH..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/michaelyql"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("michaelyql")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T10-4.github.io/tp/images/michaelyql.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T10-4.github.io/tp/team/michaelyql.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=michaelyql&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T10-4/tp/pulls?q=is%3Apr+author%3Amichaelyql"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t11"}},[_v("CS2103T-T11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-1-bakebuddy"}},[_v("CS2103T-T11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BakeBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-1-bakebuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for small business owners juggling multiple contacts across various roles who need an efficient, centralized contact management solution.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStreamline your business relationships with a robust, all-in-one contact management tool that organizes suppliers, customers, and employees while integrating seamlessly with your existing business processes.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1pcOzT2QMCi8shd18wL7oGfZAnMlYe295tp-UEgW-4gQ/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CALE.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/calebchongsj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("calebchongsj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/calebchongsj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/calebchongsj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=calebchongsj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Acalebchongsj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ryenl"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ryenl")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/ryenl.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/ryenl.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ryenl&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Aryenl"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LUCA..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yikyak02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yikyak02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/yikyak02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/yikyak02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yikyak02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Ayikyak02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QIAO..OWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bbryant824"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bbryant824")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/bbryant824.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/bbryant824.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bbryant824&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Abbryant824"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/samuelthen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("samuelthen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-1.github.io/tp/images/samuelthen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-1.github.io/tp/team/samuelthen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samuelthen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-1/tp/pulls?q=is%3Apr+author%3Asamuelthen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-2-kontacts"}},[_v("CS2103T-T11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("KonTActs]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-2-kontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching Assistants (TA) of CS2030S. TAs of CS2030S are tasked with grading their student’s work on Github through commenting on their commits.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAs of CS2030S manage many students, requiring easy access to GitHub usernames and other contacts, like professors and fellow TAs. Our product simplifies this process by providing a centralized, command-line-friendly tool to store and reference all contacts efficiently, enhancing communication and reducing workload stress.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ww5uQCleo9vz2N9SReypwjn41SDLz7RhzqGSPij0DU0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAVI.. WEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Incogdino"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Incogdino")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/incogdino.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/incogdino.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=incogdino&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3AIncogdino"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LAU ..G YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DesSnowy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DesSnowy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/dessnowy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/dessnowy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dessnowy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3ADesSnowy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SWAM..ISWA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SwaminathanViswa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SwaminathanViswa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/swaminathanviswa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/swaminathanviswa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=swaminathanviswa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3ASwaminathanViswa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEE .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/currynia"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("currynia")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/currynia.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/currynia.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=currynia&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3Acurrynia"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH .. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tohjh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tohjh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-2.github.io/tp/images/tohjh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-2.github.io/tp/team/tohjh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tohjh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-2/tp/pulls?q=is%3Apr+author%3Atohjh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-3-bridal-boss"}},[_v("CS2103T-T11-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Bridal Boss]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-3-bridal-boss","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA wedding organiser responsible for planning and managing weddings. They coordinate with vendors, clients (brides, grooms, and their families), and participants (guests, photographers, caterers, etc.). Their work involves juggling multiple tasks and deadlines to ensure that the wedding runs smoothly. CLI for efficient data entry and retrieval.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables users to manage multiple weddings simultaneously, maintaining detailed vendor and client records. It offers fast, efficient access to information, helping the user categorise and update contacts related to each wedding easily. Provides streamlined management of vendor contacts, client preferences, and event timelines.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1qKe-lru-gK0GZNs4_Zb6k_Urf59JuLBB-YZyWoFIUDw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOEY..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jowhee3011"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jowhee3011")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/jowhee3011.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/jowhee3011.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jowhee3011&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3Ajowhee3011"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUN .. YIK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yikjunxian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yikjunxian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/yikjunxian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/yikjunxian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yikjunxian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3Ayikjunxian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIM ..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Droas590"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Droas590")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/droas590.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/droas590.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=droas590&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3ADroas590"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SNG ..NICE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SherniceSng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SherniceSng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/shernicesng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/shernicesng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shernicesng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3ASherniceSng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VED ..OSHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/VedJoshi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("VedJoshi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-3.github.io/tp/images/vedjoshi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-3.github.io/tp/team/vedjoshi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vedjoshi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-3/tp/pulls?q=is%3Apr+author%3AVedJoshi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t11-4-health-connect"}},[_v("CS2103T-T11-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T11-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T11-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Health Connect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t11-4-health-connect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHospital Receptionist/ Nurses in Charge of creating duty rosters for the hospital. - Requires accurate, up-to-date and quick access to information\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur patient management system empowers nurses to efficiently retrieve and analyze patient information, enabling them to provide personalized care. By accessing comprehensive patient data, nurses can generate prioritized rosters, ensuring that those requiring the most attention are addressed promptly and effectively. This enhances patient safety, streamlines workflow, and supports nurses.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1_JGRB203WeUrUeFOMsFXAfSX1ma7rgDYD95GtjsX9ks/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ADIT..ANDE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/aditig0305"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("aditig0305")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/aditig0305.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/aditig0305.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=aditig0305&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3Aaditig0305"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AGAR..IDDH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/samriddh2145"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("samriddh2145")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/samriddh2145.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/samriddh2145.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samriddh2145&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3Asamriddh2145"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JASO.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Sornsornah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Sornsornah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/sornsornah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/sornsornah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sornsornah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3ASornsornah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KAKK..IRRA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nihirraa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nihirraa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/nihirraa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/nihirraa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nihirraa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3ANihirraa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NAYA..HESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nayanaamahesh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nayanaamahesh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T11-4.github.io/tp/images/nayanaamahesh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T11-4.github.io/tp/team/nayanaamahesh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nayanaamahesh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T11-4/tp/pulls?q=is%3Apr+author%3Anayanaamahesh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t12"}},[_v("CS2103T-T12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-1-eventory"}},[_v("CS2103T-T12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Eventory]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-1-eventory","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEvent Organizers and Planners\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product allows users to - Manage big and complex contact webs with numerous information fields, with ability to save critical details - Schedule and manage daily tasks across large teams, track their completion - Have advanced automated messaging tools, send and schedule reminders/updates in bulk\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Dy4X5ucnySZ-_11-0jbmPbqdnh_zn601m9v4Go14-L4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANTH..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/antgyf"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("antgyf")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/antgyf.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/antgyf.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=antgyf&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3Aantgyf"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAYD..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jayden-Kim-NUS"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jayden-Kim-NUS")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/jayden-kim-nus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/jayden-kim-nus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jayden-kim-nus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3AJayden-Kim-NUS"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOH ..ERAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FriedCabbageSalad"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FriedCabbageSalad")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/friedcabbagesalad.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/friedcabbagesalad.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=friedcabbagesalad&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3AFriedCabbageSalad"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hogretup"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hogretup")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/hogretup.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/hogretup.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hogretup&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3Ahogretup"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU B..OJIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wubojin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wubojin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-1.github.io/tp/images/wubojin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-1.github.io/tp/team/wubojin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wubojin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-1/tp/pulls?q=is%3Apr+author%3Awubojin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-2-planperfect"}},[_v("CS2103T-T12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PlanPerfect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-2-planperfect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for wedding planners who prefer CLI over GUI and have many contacts of clients, companies, venues, and more to keep track of. While targeted primarily at wedding planners, it is also suitable for those planning large events.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWedding planners often have to deal with many contacts which can be troublesome. AB3 provides organisational features to keep track of clients, wedding photographers, wedding locations, food caterers, guest lists and other important contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1XsDQyMXyr7DEgCbu-OxPCg4mF4sYuOlXf5KnTst5ST8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DAVI..-YAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kikokidayo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kikokidayo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/kikokidayo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/kikokidayo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kikokidayo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Akikokidayo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GHOS..ITYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/adipanda2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("adipanda2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/adipanda2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/adipanda2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=adipanda2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Aadipanda2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("IGNA.. OEY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ignatiusoey09"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ignatiusoey09")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/ignatiusoey09.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/ignatiusoey09.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ignatiusoey09&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Aignatiusoey09"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KHAN.. RAJ")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yxshrk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yxshrk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/yxshrk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/yxshrk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yxshrk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Ayxshrk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAEG..I EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/maertan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("maertan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-2.github.io/tp/images/maertan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-2.github.io/tp/team/maertan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=maertan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-2/tp/pulls?q=is%3Apr+author%3Amaertan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-3-logilink"}},[_v("CS2103T-T12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("LogiLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-3-logilink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nLogistic coordinator for logistic companies\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables the company to have an organized way to track all their shipments, plan their deliveries, calculate shipping, etc., as well as an easy and fast way to access information of all their customers and clients\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1mZdY_B3byJfSuaFXDw2TGHh6bET8Qa0LPc80lNieP0k/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALQA..IR A")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Eru111"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Eru111")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/eru111.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/eru111.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=eru111&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3AEru111"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH.. JIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaajinn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaajinn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/kaajinn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/kaajinn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaajinn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3Akaajinn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..ARON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xGladiate"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xGladiate")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/xgladiate.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/xgladiate.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xgladiate&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3AxGladiate"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YANG..MING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hm-yang1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hm-yang1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/hm-yang1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/hm-yang1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hm-yang1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3Ahm-yang1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAO..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/linedoestrolling"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("linedoestrolling")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-3.github.io/tp/images/linedoestrolling.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-3.github.io/tp/team/linedoestrolling.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=linedoestrolling&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-3/tp/pulls?q=is%3Apr+author%3Alinedoestrolling"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t12-4-gamerbook-pro-max"}},[_v("CS2103T-T12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("GamerBook Pro Max]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t12-4-gamerbook-pro-max","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is designed for gamers who play multiplayer online games and need to keep track of their gaming friends, teammates, and communities.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nGamerBook Pro Max helps users manage contact details of a small group of personal gaming friends, tracking which games they play and their usernames across different platforms.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1OKNbF4TPyH7lCZF2YMcsNbPWMSSiEnwHZl4dGlc5l7Q/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..I YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ChenLeiyu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ChenLeiyu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/chenleiyu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/chenleiyu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chenleiyu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AChenLeiyu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HUAN..NING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Kitty-001"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Kitty-001")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/kitty-001.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/kitty-001.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kitty-001&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AKitty-001"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..THEW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/flyingsalsa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("flyingsalsa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/flyingsalsa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/flyingsalsa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=flyingsalsa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3Aflyingsalsa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JJtan2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JJtan2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/jjtan2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/jjtan2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jjtan2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AJJtan2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHEN..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Xczheng0105"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Xczheng0105")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T12-4.github.io/tp/images/xczheng0105.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T12-4.github.io/tp/team/xczheng0105.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xczheng0105&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T12-4/tp/pulls?q=is%3Apr+author%3AXczheng0105"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t13"}},[_v("CS2103T-T13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-1-medconnect"}},[_v("CS2103T-T13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MedConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-1-medconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHealthcare administrators\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe app will enable healthcare administrators to consolidate contacts of hospital staff, patients and related information into a single database. Designed for high-pressure environments, it enables speedy lookups and updates, ensuring that providers can quickly connect with the right people, from on-call doctors to patients’ families, when every second counts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1VXTh2Fm6hWq7H8dXw1ksjeMk4TW4mEGKF26JhiUySnM/"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALDE..KANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/aldentantan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("aldentantan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/aldentantan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/aldentantan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=aldentantan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3Aaldentantan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KELL..QING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kellywsq03"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kellywsq03")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/kellywsq03.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/kellywsq03.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kellywsq03&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3Akellywsq03"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..HAIK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/saajidshaik02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saajidshaik02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/saajidshaik02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/saajidshaik02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=saajidshaik02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3Asaajidshaik02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..JOHN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Johnwz123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Johnwz123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-1.github.io/tp/images/johnwz123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-1.github.io/tp/team/johnwz123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=johnwz123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-1/tp/pulls?q=is%3Apr+author%3AJohnwz123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-2-nomnom-notifier"}},[_v("CS2103T-T13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NomNom Notifier]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-2-nomnom-notifier","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nManagers of smaller eateries/restaurants who need to maintain organised customer details for delivery purposes.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n- For restaurants to efficiently manage customer contact information, reducing errors and improving customer service (Reduces miscommunication and thus streamlines operations.) - To bring convenience for customers as they no longer need to repeatedly inform restaurants of their details (Fosters customer loyalty)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1iv-7g49f_GepFHfF41cpID4RBPS8eG2TUNm5G3fxwMs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOEL..RNAV")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/arnav-goel10"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("arnav-goel10")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/arnav-goel10.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/arnav-goel10.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arnav-goel10&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Aarnav-goel10"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rimgik"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rimgik")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/rimgik.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/rimgik.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rimgik&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Arimgik"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Y.. YEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yyanyee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yyanyee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/yyanyee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/yyanyee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yyanyee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Ayyanyee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH ..XING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tohhengxing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tohhengxing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/tohhengxing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/tohhengxing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tohhengxing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Atohhengxing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VINO..ILAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/noth-k"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("noth-k")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-2.github.io/tp/images/noth-k.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-2.github.io/tp/team/noth-k.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=noth-k&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-2/tp/pulls?q=is%3Apr+author%3Anoth-k"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-3-pawpatrol"}},[_v("CS2103T-T13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PawPatrol]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-3-pawpatrol","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is targeted towards veterinarians who have a high patient inflow. The features should be easy to learn and quick to use, perfect for busy veterinarians who want to better manage their clients' details but may not want to go through a steep learning curve.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAs our product is highly niche, it will offer lots of targeted features to manage client details for veterinarians. It will store data such as check-up and consultation dates, financial information as well as clinical information on their pets. It may also include a reminder and calendar feature.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1haboPcjmvgQqhhY5PHOCvMARODsj2DGcr_g-FHBoewA/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CLAR..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/clarissatjx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("clarissatjx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/clarissatjx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/clarissatjx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=clarissatjx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Aclarissatjx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DAVI.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/davidgohzk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("davidgohzk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/davidgohzk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/davidgohzk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=davidgohzk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Adavidgohzk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JONA..NHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jloh02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jloh02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/jloh02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/jloh02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jloh02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Ajloh02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JORD..CHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/naythee169"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("naythee169")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/naythee169.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/naythee169.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=naythee169&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3Anaythee169"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RODR..ARON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Runus01"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Runus01")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-3.github.io/tp/images/runus01.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-3.github.io/tp/team/runus01.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=runus01&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-3/tp/pulls?q=is%3Apr+author%3ARunus01"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t13-4-carelink"}},[_v("CS2103T-T13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CareLink]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t13-4-carelink","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIndependent Geriatricians managing elderly patients with chronic conditions, someone who can type fast, prefers CLI over GUI, and often needs to manage several patients\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nExisting software don’t fulfil the needs of independent Geriatricians as they are either generic or integrated into hospitals. They can be time-consuming and complicated. We specifically target Geriatricians by tailoring to their requirements of managing elderly patients when it comes to tracking chronic conditions, coordinating care, and maintaining regular follow-ups.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/14cdvVoXnRXXcGMSFvDDkpkL0ICsjlCmsjrMXbf5fWys/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AngPengXuan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AngPengXuan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/angpengxuan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/angpengxuan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=angpengxuan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3AAngPengXuan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GARG..ANYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lavanyagarg112"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lavanyagarg112")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/lavanyagarg112.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/lavanyagarg112.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lavanyagarg112&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3Alavanyagarg112"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRAD..ASAD")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/pradyuprasad"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pradyuprasad")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/pradyuprasad.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/pradyuprasad.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=pradyuprasad&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3Apradyuprasad"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUBR..RISH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Ponharish"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ponharish")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/ponharish.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/ponharish.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ponharish&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3APonharish"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUHA..LEEM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/suhayl13"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("suhayl13")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T13-4.github.io/tp/images/suhayl13.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T13-4.github.io/tp/team/suhayl13.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=suhayl13&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T13-4/tp/pulls?q=is%3Apr+author%3Asuhayl13"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t14"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t14"}},[_v("CS2103T-T14"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-1-prudy"}},[_v("CS2103T-T14-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Prudy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-1-prudy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nPrudential insurance agents who wants to keep track of clients insurance policies (one stop contact book for Financial Advisors to keep track of clients)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWe firstly improve efficiency through easy client management. Agents can quickly retrieve key information such as a client's insurance policies and contacts. Next, also improve client relationships by ensuring agents never miss a client policy renewal.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1tQYEegiwtcKR71e-xlsOQJc8JKkj9MzSyggcsC90rlM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nimastic"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nimastic")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/nimastic.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/nimastic.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nimastic&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3ANimastic"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUST.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Justincjr"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Justincjr")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/justincjr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/justincjr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justincjr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3AJustincjr"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RITH..ENIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rithiklenin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rithiklenin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/rithiklenin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/rithiklenin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rithiklenin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3Arithiklenin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH .. HUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yihuididi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yihuididi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/yihuididi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/yihuididi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yihuididi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3Ayihuididi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..NGKE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ckaayy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ckaayy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-1.github.io/tp/images/ckaayy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-1.github.io/tp/team/ckaayy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ckaayy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-1/tp/pulls?q=is%3Apr+author%3Ackaayy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-2-adminus"}},[_v("CS2103T-T14-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AdmiNUS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-2-adminus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInternational students or exchange students joining NUS who are navigating a new environment and need to keep track of important academic, social, and emergency contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHelps international students manage important contacts such as tutors, groupmates, friends, and emergency services in an organised and efficient manner, reducing stress in an unfamiliar environment. Optimised for users who prefer a CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1aFF0eembSWjZtmoQIc1BhzDi9DR1Q2OCGjnEjeIS5Cw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAR..YING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/charlenetcy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("charlenetcy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/charlenetcy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/charlenetcy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=charlenetcy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Acharlenetcy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LERO.. KIT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leroychiu20"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leroychiu20")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/leroychiu20.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/leroychiu20.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leroychiu20&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Aleroychiu20"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/limjeremy496"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("limjeremy496")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/limjeremy496.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/limjeremy496.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limjeremy496&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Alimjeremy496"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAH..A YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JiaYi-Gallium369"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JiaYi-Gallium369")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/jiayi-gallium369.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/jiayi-gallium369.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jiayi-gallium369&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3AJiaYi-Gallium369"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIOW..MING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ruiming97"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ruiming97")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-2.github.io/tp/images/ruiming97.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-2.github.io/tp/team/ruiming97.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ruiming97&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-2/tp/pulls?q=is%3Apr+author%3Aruiming97"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-3-mater"}},[_v("CS2103T-T14-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MATER]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-3-mater","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for car mechanics and is optimized for users who prefer a CLI over GUI. It is meant for fast access to client details\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n1.Provides a quick way for car workshop to consolidate and retrieve client details 2.Easier than pen and paper tracking/sticky notes in a workshop setting, using a work laptop close by 3.More reliable search tool compared to mechanic group chat, for example 4.Allow workshop mechanics to track car history and issues.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/12RRcWVRsM7XEHQ1mes6OfQCJufhUYHGeG8V33L_Xm6k/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CALE..YONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/calebyyy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("calebyyy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/calebyyy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/calebyyy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=calebyyy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3Acalebyyy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HAN ..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xhamyo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xhamyo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/xhamyo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/xhamyo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xhamyo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3Axhamyo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..QUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/limyuquan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("limyuquan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/limyuquan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/limyuquan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limyuquan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3Alimyuquan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MOHA..IRUL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Meowloid"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Meowloid")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/meowloid.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/meowloid.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=meowloid&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3AMeowloid"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..U XI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SeanWong2"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SeanWong2")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-3.github.io/tp/images/seanwong2.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-3.github.io/tp/team/seanwong2.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seanwong2&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-3/tp/pulls?q=is%3Apr+author%3ASeanWong2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t14-4-agentassist"}},[_v("CS2103T-T14-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T14-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T14-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("AgentAssist]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t14-4-agentassist","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur target audience is a new generation of young, tech-savvy bank call-centre agents who must satisfy clients' queries. They are swift at typing and prefer commands over traditional GUIs, and yet want some form of GUI instead of looking at an ugly, traditional terminal.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product aims to provide sales banking agents with a CLI that provides all necessary client and credit card details at a glance, with an aesthetic but minimalist UI, boosting speed and efficiency for a better average response time when handling customers,\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1NBoceIvh3UV84Boi3eVsGu8D7uDI4E5QeMDHDjoTjvo/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("COLI..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/colinhia"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("colinhia")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/colinhia.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/colinhia.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=colinhia&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3Acolinhia"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FION..QIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FionaQY"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FionaQY")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/fionaqy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/fionaqy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fionaqy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3AFionaQY"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LITC..SORN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/iamdiluxedbutcooler"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("iamdiluxedbutcooler")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/iamdiluxedbutcooler.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/iamdiluxedbutcooler.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=iamdiluxedbutcooler&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3Aiamdiluxedbutcooler"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. YEW")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/itsme-zeix"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("itsme-zeix")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/itsme-zeix.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/itsme-zeix.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itsme-zeix&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3Aitsme-zeix"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHEN.. REN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ZShunRen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ZShunRen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T14-4.github.io/tp/images/zshunren.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T14-4.github.io/tp/team/zshunren.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zshunren&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T14-4/tp/pulls?q=is%3Apr+author%3AZShunRen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t15"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t15"}},[_v("CS2103T-T15"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-1-truerental"}},[_v("CS2103T-T15-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TrueRental]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-1-truerental","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nLetting agents\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nLetting agents must manage many clients' personal and property information, e.g. contact details, addresses, rent information, rent prices, tenant information, document storage, and automated reminders. There is too much information for letting agents to keep track of. Hence, our enhanced CLI tool can help them address these problems!\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1i69rY-wnMI2xZN7V58xvLIAfpLX_7xwy2S85IlnXxyo/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BRYA.. HOE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bryanckh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bryanckh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/bryanckh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/bryanckh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bryanckh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Abryanckh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOH .. LIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gohsl99"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gohsl99")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/gohsl99.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/gohsl99.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gohsl99&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Agohsl99"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KANG..HARY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zackjh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zackjh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/zackjh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/zackjh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zackjh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Azackjh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NATH..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RobotWizzard"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RobotWizzard")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/robotwizzard.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/robotwizzard.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=robotwizzard&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3ARobotWizzard"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WINS..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/winstonlimjy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("winstonlimjy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-1.github.io/tp/images/winstonlimjy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-1.github.io/tp/team/winstonlimjy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=winstonlimjy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-1/tp/pulls?q=is%3Apr+author%3Awinstonlimjy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-2-edututu"}},[_v("CS2103T-T15-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduTutu]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-2-edututu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor tuition center administrators with a great number of students, teachers, and parents to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nMiscommunication, missed updates, and disorganized contact lists can disrupt the learning process, leading to confusion about schedules, and affect the overall student experience. Our address book allows administrative professions to keep track of these information, optimized for quickness and efficiency of commands (CLI-based).\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1v0On7-gKXhThqJdzDh-yefbyo89q4qEr0ziV_C1mBHk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HOO ..HING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hooyushing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hooyushing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/hooyushing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/hooyushing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hooyushing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Ahooyushing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KIM ..NHUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/munhuikim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("munhuikim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/munhuikim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/munhuikim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=munhuikim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Amunhuikim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MATT.. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sumomomomomo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sumomomomomo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/sumomomomomo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/sumomomomomo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sumomomomomo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Asumomomomomo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VU H..KIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kienvumrpm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kienvumrpm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/kienvumrpm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/kienvumrpm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kienvumrpm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Akienvumrpm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. HIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/waihin26"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("waihin26")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-2.github.io/tp/images/waihin26.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-2.github.io/tp/team/waihin26.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=waihin26&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-2/tp/pulls?q=is%3Apr+author%3Awaihin26"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-3-ward-watch"}},[_v("CS2103T-T15-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Ward-Watch]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-3-ward-watch","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nRounding Doctors: Doctors who perform visits to patients in hospital wards ranging from physicians, residents, or medical interns, depending on the hospital setting.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe app streamlines the management of patients by providing hospital doctors with patient information such as ward location, diagnosis, medication dispensed and notes. Ward-Watch also provides the doctor with a timeline of his upcoming scheduled appointments across the day ensuring efficient patient care and reducing the risk of missed visits.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1VWsdOjGaREfIH4-OxCadjsluOpKXejXTgl0jvzpF21g/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/niclammm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("niclammm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/niclammm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/niclammm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=niclammm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Aniclammm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("OH C..ARON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/daronoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("daronoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/daronoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/daronoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=daronoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Adaronoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("POH ..HOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/choonzies"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("choonzies")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/choonzies.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/choonzies.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=choonzies&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Achoonzies"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHUC..RRYL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shuckycheese"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shuckycheese")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/shuckycheese.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/shuckycheese.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shuckycheese&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Ashuckycheese"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..ENCE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/clarud"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("clarud")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-3.github.io/tp/images/clarud.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-3.github.io/tp/team/clarud.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=clarud&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-3/tp/pulls?q=is%3Apr+author%3Aclarud"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t15-4-hrconnect"}},[_v("CS2103T-T15-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T15-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T15-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HRConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t15-4-hrconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHR professionals in a tech company\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIt provides fast access to employee, contractor, and candidate contact details, optimized for HR professionals who prefer a CLI. It allows quick updates, talent pool organization, and candidate tracking, all through a streamlined, command-based interface designed for speed and efficiency. It also helps with assignment of HR staff to HR events and cases.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1uYDLHgG98IgLWoQaIjvtHl29D1PBn9bhKCln44LAw14/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DO G..HIEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mrnobody0505"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mrnobody0505")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/mrnobody0505.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/mrnobody0505.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mrnobody0505&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3Amrnobody0505"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GAN ..YICK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ItsMeNengYi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ItsMeNengYi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/itsmenengyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/itsmenengyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itsmenengyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3AItsMeNengYi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH.. KIT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Professional-Procrastinat0r"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Professional-Procrastinat0r")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/professional-procrastinat0r.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/professional-procrastinat0r.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=professional-procrastinat0r&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3AProfessional-Procrastinat0r"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE .. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LeeZeHao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LeeZeHao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/leezehao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/leezehao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leezehao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3ALeeZeHao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU..ENZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SamuelFoo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SamuelFoo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T15-4.github.io/tp/images/samuelfoo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T15-4.github.io/tp/team/samuelfoo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=samuelfoo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T15-4/tp/pulls?q=is%3Apr+author%3ASamuelFoo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t16"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t16"}},[_v("CS2103T-T16"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-1-hrhelper"}},[_v("CS2103T-T16-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("HRHelper]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-1-hrhelper","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCompanies’ HR trying to keep track of their employees’ data and wants a fuss-free GUI\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOptimised for fast typers instead of being slowed down by GUI. Better filtration of date that updates real time.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1uffweuProz7tL5Leic24e_aBvmcfInxbYkIstBphFGs/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JALE..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jalenleeruixian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jalenleeruixian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/jalenleeruixian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/jalenleeruixian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jalenleeruixian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3AJalenleeruixian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. ZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/W3iZhi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("W3iZhi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/w3izhi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/w3izhi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=w3izhi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3AW3iZhi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU J..NHAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/WuJinhan1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("WuJinhan1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/wujinhan1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/wujinhan1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wujinhan1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3AWuJinhan1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAO ..EJUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/testing1234567891011121314"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("testing1234567891011121314")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/testing1234567891011121314.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/testing1234567891011121314.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=testing1234567891011121314&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3Atesting1234567891011121314"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAO ..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/publicmain"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("publicmain")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-1.github.io/tp/images/publicmain.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-1.github.io/tp/team/publicmain.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=publicmain&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-1/tp/pulls?q=is%3Apr+author%3Apublicmain"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-2-clientgrid"}},[_v("CS2103T-T16-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClientGrid.]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-2-clientgrid","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal estate agents who want to monitor the buying and selling of properties.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nClientGrid is a address book designed for real estate agents to efficiently manage client contacts, including buyers and sellers. It provides a streamlined way to organize client data and monitor the buying or selling process while maintaining core address book functionality.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1iyn4FZ99_RKB3DTJAjX2xmGztedWjc9ZZerx0YFfkjw/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANTH..ANTO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thony-ui"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thony-ui")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/thony-ui.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/thony-ui.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thony-ui&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Athony-ui"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HRIS..NDAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Virusrwj223"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Virusrwj223")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/virusrwj223.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/virusrwj223.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=virusrwj223&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3AVirusrwj223"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/apollo-tan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("apollo-tan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/apollo-tan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/apollo-tan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=apollo-tan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Aapollo-tan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WEE .. LIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jolwnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jolwnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/jolwnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/jolwnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jolwnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Ajolwnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YONG.. HOU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yongkheehou"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yongkheehou")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-2.github.io/tp/images/yongkheehou.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-2.github.io/tp/team/yongkheehou.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yongkheehou&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-2/tp/pulls?q=is%3Apr+author%3Ayongkheehou"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-3-contactsforgood-cfg"}},[_v("CS2103T-T16-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ContactsForGood (CFG)]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-3-contactsforgood-cfg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAdministrators of small scale NGOs\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nContactsForGood helps NGO administrators efficiently manage donors, volunteers, and partners by organising contacts, tracking engagement, and setting follow-up reminders. With its typing-focused interface and offline, editable data, CFG hopes to streamline contact management, allowing administrators to focus on outreach and mission-critical tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ww9NezH6QkTyddvM5fsnseuD3H5Y6BYKJHXGGN6nBI8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. SUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chongsun2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chongsun2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/chongsun2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/chongsun2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chongsun2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Achongsun2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUST..CHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Justin-Yeo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Justin-Yeo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/justin-yeo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/justin-yeo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justin-yeo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3AJustin-Yeo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOU ..NZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zzzlou"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zzzlou")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/zzzlou.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/zzzlou.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zzzlou&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Azzzlou"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAH..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seah-minlong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seah-minlong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/seah-minlong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/seah-minlong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seah-minlong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Aseah-minlong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("XAN ..N NG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/voldiemort"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("voldiemort")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-3.github.io/tp/images/voldiemort.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-3.github.io/tp/team/voldiemort.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=voldiemort&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-3/tp/pulls?q=is%3Apr+author%3Avoldiemort"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t16-4-teletutors"}},[_v("CS2103T-T16-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T16-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T16-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TeleTutors]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t16-4-teletutors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTutors / Tuition centers managing students / parents\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEasier management of administrative tasks Easier for users who are more proficient at CLI-interfaces Separate work and personal tasks and messages.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1sp67pXGYO8AjFKAXgX8hE1yJ0R90Pd-P1euGl-YYfrs/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON..NSEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Ansel-Ch"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ansel-Ch")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/ansel-ch.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/ansel-ch.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ansel-ch&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3AAnsel-Ch"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..RELL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jerrelllee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jerrelllee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/jerrelllee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/jerrelllee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jerrelllee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3Ajerrelllee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NATH..PING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/natlv"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("natlv")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/natlv.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/natlv.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=natlv&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3Anatlv"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOON..HUGH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gnoossk"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gnoossk")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/gnoossk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/gnoossk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gnoossk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3Agnoossk"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..KEAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Edsel-Tan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Edsel-Tan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T16-4.github.io/tp/images/edsel-tan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T16-4.github.io/tp/team/edsel-tan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=edsel-tan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T16-4/tp/pulls?q=is%3Apr+author%3AEdsel-Tan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-t17"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-t17"}},[_v("CS2103T-T17"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-1-universe"}},[_v("CS2103T-T17-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("UniVerse]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-1-universe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for university students who want to make friends and grow their professional networks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product allows university students to easily access and manage their professional networks, interests, and academic backgrounds.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1HEqU6DAOUiPmxz6tga57VoEyltfCyQiUpGZpJukq81c/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..N LE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chenle228"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chenle228")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/chenle228.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/chenle228.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chenle228&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Achenle228"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..REMY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jeremychiaaaaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jeremychiaaaaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/jeremychiaaaaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/jeremychiaaaaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jeremychiaaaaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Ajeremychiaaaaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOH ..VERA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/verakohh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("verakohh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/verakohh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/verakohh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=verakohh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Averakohh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KUIK..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kuiktzecheng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kuiktzecheng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/kuiktzecheng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/kuiktzecheng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kuiktzecheng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Akuiktzecheng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MALH..RNAV")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/arnav12344"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("arnav12344")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-1.github.io/tp/images/arnav12344.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-1.github.io/tp/team/arnav12344.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arnav12344&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-1/tp/pulls?q=is%3Apr+author%3Aarnav12344"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-2-servicetrack"}},[_v("CS2103T-T17-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ServiceTrack]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-2-servicetrack","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nCustomer Service Representatives who engage with customers on a daily basis.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide convenient access to customer profiles, details, and service history, enhancing operational efficiency and enabling personalized customer interaction, leading to improved customer satisfaction.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/16dNVk-aSSQSUiGqHW5Bj7H-d9ZgLeXX2k3Wz907rHRo/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ENG .. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/engyuhan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("engyuhan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/engyuhan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/engyuhan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=engyuhan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3Aengyuhan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HU H.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/muller317"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("muller317")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/muller317.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/muller317.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=muller317&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3Amuller317"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LU R..JIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RuijianLu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RuijianLu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/ruijianlu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/ruijianlu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ruijianlu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3ARuijianLu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PARK..OUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Judy1x4"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Judy1x4")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/judy1x4.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/judy1x4.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=judy1x4&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3AJudy1x4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..RIEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/1st2GetThisName"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1st2GetThisName")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-2.github.io/tp/images/1st2getthisname.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-2.github.io/tp/team/1st2getthisname.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=1st2getthisname&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-2/tp/pulls?q=is%3Apr+author%3A1st2GetThisName"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-3-inventrack"}},[_v("CS2103T-T17-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("InvenTrack]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-3-inventrack","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInventory managers at 7-Eleven convenience stores. They regularly communicate with suppliers and prefer a fast, efficient typing interface over mouse or voice commands.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInvenTrack enables inventory managers to efficiently manage multiple supplier contact information and streamline communication, ensuring smooth operations and minimizing errors in stock replenishment, all through a typing-optimized interface.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1BIh0Z41bUoHxti-b52m2GUxvHyxqp_okqBLq4rHaTJ8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI Y..TONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yu7ong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yu7ong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/yu7ong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/yu7ong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yu7ong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3Ayu7ong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRAV..VITA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Anvita2110"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Anvita2110")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/anvita2110.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/anvita2110.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=anvita2110&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3AAnvita2110"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SING..UMAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ritulkrsingh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ritulkrsingh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/ritulkrsingh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/ritulkrsingh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ritulkrsingh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3Aritulkrsingh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("UDIT..NGHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/T1duS"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("T1duS")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/t1dus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/t1dus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=t1dus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3AT1duS"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("XIE ..NGZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zacharyxzz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zacharyxzz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-3.github.io/tp/images/zacharyxzz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-3.github.io/tp/team/zacharyxzz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zacharyxzz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-3/tp/pulls?q=is%3Apr+author%3Azacharyxzz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-t17-4-salescontactpro"}},[_v("CS2103T-T17-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-T17-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-T17-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SalesContactPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-t17-4-salescontactpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is specifically for sales representatives who prefer CLI over GUI to manage their contacts and interactions with clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product streamlines contact management, enhances productivity, and optimizes the sales process through rapid data entry and retrieval. This is suitable for high-volume, rapid-paced sales environments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1OWEKv-tXqB6Hzp-x9olQho4s3OHfRDHwLDbXMt2kges/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MANA.. BAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LOLIPOP-INTELLIGENCE"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LOLIPOP-INTELLIGENCE")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/lolipop-intelligence.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/lolipop-intelligence.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lolipop-intelligence&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3ALOLIPOP-INTELLIGENCE"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOO .. TAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sooyitao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sooyitao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/sooyitao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/sooyitao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sooyitao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3Asooyitao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TYAG..ARVA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ty4g1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ty4g1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/ty4g1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/ty4g1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ty4g1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3Aty4g1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEO ..ORGE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/george-yeo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("george-yeo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-T17-4.github.io/tp/images/george-yeo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-T17-4.github.io/tp/team/george-yeo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=george-yeo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-T17-4/tp/pulls?q=is%3Apr+author%3Ageorge-yeo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f08"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f08"}},[_v("CS2103T-F08"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-1-voluntier"}},[_v("CS2103T-F08-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("VolunTier]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-1-voluntier","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for supervisors in volunteering organisations who have to manage lots of volunteers under them and have to easily access information regarding these volunteers.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nWe notice people working in voluntary organisations tend not to have proper resources to manage large amounts of volunteers in the organisation along with their associated data and projects, so this address book serves to address this issue by providing a structured way to store and access volunteer data easily.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1X6DpsMsJywuO7qDL7td49iq0NGNEqFolllisyfnlkuY/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("IVAN..U EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kohkakohla"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kohkakohla")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/kohkakohla.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/kohkakohla.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kohkakohla&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3Akohkakohla"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI M..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mingyang143"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mingyang143")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/mingyang143.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/mingyang143.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mingyang143&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3Amingyang143"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..ELLE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/estellelim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("estellelim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/estellelim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/estellelim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=estellelim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3Aestellelim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIAH..EVAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jollybomber"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jollybomber")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/jollybomber.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/jollybomber.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jollybomber&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3AJollybomber"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAO ..COLN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Plishh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Plishh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/images/plishh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-1a.github.io/tp/team/plishh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=plishh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-1a/tp/pulls?q=is%3Apr+author%3APlishh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-2-researchroster"}},[_v("CS2103T-F08-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ResearchRoster]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-2-researchroster","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nResearchRoster is for researchers who are managing a large number of study participants and need an easy way to contact different experimental groups. It provides quick access to study participants’ information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAs researchers have to handle large groups of participants across multiple studies, ResearchRoster allows them to have all participants consolidated in a single program. It is optimized to consolidate a list of contact details based on specific experimental criteria, and export it to an easy-to-read format for better data organization.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1aLvEOMUXmcZzwrACewvZBCcX4b-1U4IEw8-bXqCv8iM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DHAR..HWIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sannie-beep"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sannie-beep")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/sannie-beep.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/sannie-beep.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sannie-beep&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Asannie-beep"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG K..HIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/k-hian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("k-hian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/k-hian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/k-hian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=k-hian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Ak-hian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRIS..KASH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/PrishaVP"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PrishaVP")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/prishavp.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/prishavp.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=prishavp&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3APrishaVP"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wkxcass"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wkxcass")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/wkxcass.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/wkxcass.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wkxcass&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Awkxcass"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU J..AWEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wujiaweijoanna"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wujiaweijoanna")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-2.github.io/tp/images/wujiaweijoanna.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-2.github.io/tp/team/wujiaweijoanna.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wujiaweijoanna&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-2/tp/pulls?q=is%3Apr+author%3Awujiaweijoanna"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-3-findingbrudders"}},[_v("CS2103T-F08-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("FindingbrUdders]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-3-findingbrudders","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nComputing students from NUS (and by extension, possibly every other university that offers computing-related studies) who enjoys meeting new kinds of people.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHas CS become too stressful? Tired of connecting through Talent Connect, LinkedIn, or even NUSConfessIT? Want to form a more personal relationship full of genuine human touch? Let's make finding benefactors, dependable colleagues, and insightful mentors easier for you!\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1PGoRzGKE3dGOaHMaownxuHjPEaKImKB4WEXdRqSBWK4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIN ..INER")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/XinghuaJulia"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XinghuaJulia")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/xinghuajulia.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/xinghuajulia.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xinghuajulia&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3AXinghuaJulia"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("P SH..ARAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/psh12320"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("psh12320")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/psh12320.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/psh12320.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=psh12320&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3Apsh12320"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PETE..JAYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/PeterHW963"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PeterHW963")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/peterhw963.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/peterhw963.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=peterhw963&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3APeterHW963"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SANK..NIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/marraknas"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("marraknas")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/marraknas.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/marraknas.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=marraknas&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3Amarraknas"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ULRI..ANDO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ulricolo7"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ulricolo7")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-3.github.io/tp/images/ulricolo7.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-3.github.io/tp/team/ulricolo7.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ulricolo7&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-3/tp/pulls?q=is%3Apr+author%3Aulricolo7"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f08-4-netbook"}},[_v("CS2103T-F08-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F08-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F08-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NetBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f08-4-netbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSoC students who socialise often and looking for internships\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAllows SoC students to quickly and easily manage the relationships they form with others in school and on their journey to acquire internships. SoC students are likely to prefer a CLI due to their background in computing. SoC students can most likely type fast.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Vr1wZfBfklEStheRZgSa6OBC2zG0Jooi9HtBBNz2XWU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEA.. IAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/IanCheah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("IanCheah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/iancheah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/iancheah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=iancheah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3AIanCheah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIU ..INZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/YINZE66"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YINZE66")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/yinze66.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/yinze66.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yinze66&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3AYINZE66"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NIGE..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nigellqx"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nigellqx")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/nigellqx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/nigellqx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nigellqx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3Anigellqx"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG ..RREN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/O-Darren"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("O-Darren")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/o-darren.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/o-darren.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=o-darren&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3AO-Darren"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SPAR..UMAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/justsparsh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("justsparsh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F08-4.github.io/tp/images/justsparsh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F08-4.github.io/tp/team/justsparsh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justsparsh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F08-4/tp/pulls?q=is%3Apr+author%3Ajustsparsh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f09"}},[_v("CS2103T-F09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-1-clubconnect"}},[_v("CS2103T-F09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClubConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-1-clubconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nComputing Club Committee Computing Club Committee members are tech-savvy leaders who organize events, manage activities, and foster community engagement. They connect members, sponsors, and industry partners, driving innovation and learning.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStreamline computing club's communication and organization with our address book app. Effortlessly manage member details, sponsor contacts, and event participants in one place. Enhance collaboration, boost engagement, and ensure seamless planning, all while saving time and reducing administrative hassle.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1xTj4pvGG059O44UBxdJ5lqIV0dIofXJAGZIIjcrHa0Y/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/G-Y-Chan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("G-Y-Chan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/g-y-chan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/g-y-chan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=g-y-chan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3AG-Y-Chan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..JIE)")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NicholasCWK"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NicholasCWK")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/nicholascwk.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/nicholascwk.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholascwk&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3ANicholasCWK"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LI H..IXIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LiHaixin000"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LiHaixin000")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/lihaixin000.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/lihaixin000.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lihaixin000&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3ALiHaixin000"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/limyixiang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("limyixiang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/limyixiang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/limyixiang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limyixiang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3Alimyixiang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH.. LUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nicholaskoh1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nicholaskoh1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-1.github.io/tp/images/nicholaskoh1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-1.github.io/tp/team/nicholaskoh1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholaskoh1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-1/tp/pulls?q=is%3Apr+author%3ANicholaskoh1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-2-planpal"}},[_v("CS2103T-F09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PlanPal]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-2-planpal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for student event planners at NUS who need to manage contacts like attendees, volunteers, sponsors, and vendors for their events.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor student planners who need a seamless way to manage contacts, our address book provides a centralized platform to organize, track, and access the contact information and details of attendees, vendors, sponsors and volunteers, thus enabling effortless coordination of logistics and ensures smooth communication for every event.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/11IzBzNx5GsvHm568-AZ52EKrvZ8d248ftqZCLIZ-2go/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BRIA.. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/brianchoon"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("brianchoon")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/brianchoon.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/brianchoon.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=brianchoon&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Abrianchoon"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/cshao02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cshao02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/cshao02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/cshao02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cshao02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Acshao02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chuajunyu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chuajunyu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/chuajunyu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/chuajunyu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chuajunyu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Achuajunyu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DHRU..ARMA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shardhrv"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shardhrv")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/shardhrv.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/shardhrv.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shardhrv&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Ashardhrv"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("THEN.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jan-kai1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jan-kai1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-2.github.io/tp/images/jan-kai1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-2.github.io/tp/team/jan-kai1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jan-kai1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-2/tp/pulls?q=is%3Apr+author%3Ajan-kai1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-3-bridalbuddy"}},[_v("CS2103T-F09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BridalBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-3-bridalbuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for wedding planners who type quickly and prefer command-line interfaces over graphical user interfaces, needing to efficiently manage details about different stakeholders for each wedding, including family members, attendees, helpers, photographers, caterers and florists.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide wedding planners with a streamlined, all-in-one wedding planning tool that simplifies the usually time-intensive and tedious tasks of managing guest lists, schedules, and vendor contacts. By offering intuitive organisation and customisation, the app ensures a stress-free and efficient planning process, serving as a one-stop companion for wedding planners.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1zs_EfK19jkKojZqxOAvW6RlySXBxonu8IoFxCdB37iM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HOVA.. MAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hovanleong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hovanleong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/hovanleong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/hovanleong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hovanleong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Ahovanleong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. BIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weibinlim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weibinlim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/weibinlim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/weibinlim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weibinlim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Aweibinlim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAMU..G EN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/slye20"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("slye20")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/slye20.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/slye20.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=slye20&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Aslye20"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yxtan02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yxtan02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/yxtan02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/yxtan02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yxtan02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3Ayxtan02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YANG..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/YangQF2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YangQF2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-3.github.io/tp/images/yangqf2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-3.github.io/tp/team/yangqf2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yangqf2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-3/tp/pulls?q=is%3Apr+author%3AYangQF2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f09-4-tuteez"}},[_v("CS2103T-F09-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F09-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F09-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("tuteez]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f09-4-tuteez","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTech Savvy full-time private tutors who exclusively teach 1-1 lessons (no group lessons) on a regular weekly schedule.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur app serves as an address book tailored for tech-savvy full-time tuition teachers who prefer to use CLI, streamlining the management of student schedules and contact details. It effectively prevents scheduling conflicts and allows for quick access to essential information, enabling teachers to prioritise teaching over administration.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1fhMcHoQjPFKYh-oNHDdoLp1Z8gX59T4lWQYmzJ8qa_M/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..LENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/luileng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("luileng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/luileng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/luileng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=luileng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Aluileng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CURT..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/curtischang2510"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("curtischang2510")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/curtischang2510.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/curtischang2510.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=curtischang2510&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Acurtischang2510"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QUAH..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaikquah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaikquah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/kaikquah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/kaikquah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaikquah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Akaikquah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..JING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/potaotototo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("potaotototo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/potaotototo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/potaotototo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=potaotototo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Apotaotototo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..JIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weijianwong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weijianwong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F09-4.github.io/tp/images/weijianwong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F09-4.github.io/tp/team/weijianwong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weijianwong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F09-4/tp/pulls?q=is%3Apr+author%3Aweijianwong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f09"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f09"}},[_v("CS2103-F09"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f09-1-data-conductors"}},[_v("CS2103-F09-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F09-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F09-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("data coNdUctorS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09-1-data-conductors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAdministrative Director of CCAs (Co-Curricular Activities) in NUS who has to manage and access the database of the members. The database size is around 50 students. These directors are tech savvy who can type fast.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEnables users to efficiently and easily manage and access large CCA membership database (including creation, edit, and deletion of data entries)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1a9kYfmwuXTSDPhvDxFZHLqDkaGN5RGON-qcsrhxwXCA/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. HUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/cth06-Github"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cth06-Github")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/cth06-github.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/cth06-github.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cth06-github&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3Acth06-Github"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ERNE..RONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/somethingfishyfishy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("somethingfishyfishy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/somethingfishyfishy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/somethingfishyfishy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=somethingfishyfishy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3Asomethingfishyfishy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JIN ..STON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/WinstonJin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("WinstonJin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/winstonjin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/winstonjin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=winstonjin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3AWinstonJin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..I SI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LowXiSi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LowXiSi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/lowxisi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/lowxisi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lowxisi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3ALowXiSi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WU Z..NGFU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wuzengfu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wuzengfu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-1.github.io/tp/images/wuzengfu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-1.github.io/tp/team/wuzengfu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wuzengfu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-1/tp/pulls?q=is%3Apr+author%3Awuzengfu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f09-2-realconnect"}},[_v("CS2103-F09-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F09-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F09-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("RealConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09-2-realconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal Estate/Sales Agents\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA user-friendly address book that simplifies the process of storing and retrieving client information. Categorize contacts into groups like buyers, sellers, and leads, helping you stay organized. Automate reminders and notes, ensuring you never miss an opportunity to engage clients. Easily organize contacts to their profile, for a streamlined experience.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1BOyh8IrdTpxgtjt2YFEOjupSehAZtvfs_LS-UD091AQ/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HE M..NHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/minhao23"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("minhao23")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/minhao23.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/minhao23.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=minhao23&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3Aminhao23"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAVI..GERI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/starbucksventi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("starbucksventi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/starbucksventi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/starbucksventi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=starbucksventi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3Astarbucksventi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUGI..UJIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jinnsuke"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jinnsuke")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/jinnsuke.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/jinnsuke.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jinnsuke&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3Ajinnsuke"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..XIYU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Wxy2003-xy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Wxy2003-xy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-2.github.io/tp/images/wxy2003-xy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-2.github.io/tp/team/wxy2003-xy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wxy2003-xy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-2/tp/pulls?q=is%3Apr+author%3AWxy2003-xy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f09-3-talentcy"}},[_v("CS2103-F09-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F09-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F09-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Talentcy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f09-3-talentcy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for employees of talent recruitment departments of companies who want to manage contact of job applicants.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis app streamlines the process of managing talent contact information by centralizing essential contact details, making it easier to organise, search, and update information on potential candidates. Its search and filtering capabilities help recruiters quickly find profiles based on specific criteria, improving efficiency, and reducing time spent on administrative tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1sCnzwqayF-Az8qcZyVM59ndFGalKZdjv6cwEVGqfIkk/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN..K YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ChinSekYi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ChinSekYi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/chinsekyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/chinsekyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chinsekyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3AChinSekYi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HANS..JUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hansneddyanto"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hansneddyanto")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/hansneddyanto.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/hansneddyanto.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hansneddyanto&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3Ahansneddyanto"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HAST..ANTI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hazzle23"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hazzle23")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/hazzle23.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/hazzle23.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hazzle23&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3Ahazzle23"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VICE..AKHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/vicelyav"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("vicelyav")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F09-3.github.io/tp/images/vicelyav.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F09-3.github.io/tp/team/vicelyav.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vicelyav&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F09-3/tp/pulls?q=is%3Apr+author%3Avicelyav"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f10"}},[_v("CS2103T-F10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-1-clienthub"}},[_v("CS2103T-F10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClientHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-1-clienthub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for tech savvy and independent financial advisors who have more than 50 clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product provides independent financial advisors with a streamlined tool to manage client details (eg. Track insurance policies). Optimized for simplicity and efficiency, this product makes the lives of financial advisors easier by offering easier access to relevant information for their clients.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ujzOuSrzMISrTGaP1CefukFCdysEnk_sHIGp6RrApzY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AHMA..ALIM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ahmadsyuaib"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ahmadsyuaib")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/ahmadsyuaib.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/ahmadsyuaib.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ahmadsyuaib&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3Aahmadsyuaib"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HARI..SHAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Harithhh06"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Harithhh06")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/harithhh06.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/harithhh06.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=harithhh06&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3AHarithhh06"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JERE..N ZE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jereeemyyyy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jereeemyyyy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/jereeemyyyy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/jereeemyyyy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jereeemyyyy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3Ajereeemyyyy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIN ..UBIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rubinnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rubinnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/rubinnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/rubinnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rubinnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3Arubinnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIU .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/L-rrrr"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("L-rrrr")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-1.github.io/tp/images/l-rrrr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-1.github.io/tp/team/l-rrrr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=l-rrrr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-1/tp/pulls?q=is%3Apr+author%3AL-rrrr"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-2-clinicconnect"}},[_v("CS2103T-F10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClinicConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-2-clinicconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStaff working at private health screening clinics and attend to new and existing patients who prefer a unified platform to perform clinic-related tasks in one place.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nUnified platform allowing clinic assistants to perform many clinic-related tasks in one place. Contains specific fields unique to healthcare screening clinics such as insurance providers, insurance processing status, patient screening package, screening dates, payment dues. Provides fast access to patient information through smart search and filtering capabilities.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1DOngDeMInmlPI_rEZJh_bXyAi8P-JMMTQ5JBdbSvRCI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..NESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DINESH1201"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DINESH1201")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/dinesh1201.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/dinesh1201.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dinesh1201&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3ADINESH1201"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN..YUEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Arren11111"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Arren11111")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/arren11111.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/arren11111.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arren11111&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3AArren11111"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yuanchengg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yuanchengg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/yuanchengg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/yuanchengg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yuanchengg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3Ayuanchengg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEOW..OLYN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jolynleow2301"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jolynleow2301")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/jolynleow2301.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/jolynleow2301.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jolynleow2301&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3Ajolynleow2301"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PATC..UMAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yugan01"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yugan01")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-2.github.io/tp/images/yugan01.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-2.github.io/tp/team/yugan01.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yugan01&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-2/tp/pulls?q=is%3Apr+author%3Ayugan01"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-3-nustates"}},[_v("CS2103T-F10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NUStates]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-3-nustates","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal Estate Agents in Singapore managing contacts\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal Estate Agents can organize and categorize client and seller contacts, schedule appointments, contact clients about new property listings that match their client's preferences, and be notified to contact clients on key dates or at regular intervals.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1M_6hTGRPNeLusQyEN4q9nSI-ebz4OxYyGQBKaRAI5gI/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DYLA..FUNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Potatoad88"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Potatoad88")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/potatoad88.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/potatoad88.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=potatoad88&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3APotatoad88"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ISAA..XIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ITZXITZX"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ITZXITZX")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/itzxitzx.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/itzxitzx.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itzxitzx&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3AITZXITZX"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW .. BIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/OrangeCatLoves"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("OrangeCatLoves")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/orangecatloves.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/orangecatloves.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=orangecatloves&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3AOrangeCatLoves"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PATO..ISHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/triishaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("triishaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/triishaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/triishaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=triishaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3Atriishaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..QUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xqtann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xqtann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-3.github.io/tp/images/xqtann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-3.github.io/tp/team/xqtann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xqtann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-3/tp/pulls?q=is%3Apr+author%3Axqtann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f10-4-techconnect"}},[_v("CS2103T-F10-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F10-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F10-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TechConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f10-4-techconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe product is for users who are looking for job opportunities in the tech industry.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe app provides users access to companies' contacts as well as various information regarding the company.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1LYIN6iWqDW-H0YXESw0BPUrFaW3qPvZcc6ykhKzbnIM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..RYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rynlwhh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rynlwhh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/rynlwhh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/rynlwhh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rynlwhh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Arynlwhh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LING.. YAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LingZiyann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LingZiyann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/lingziyann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/lingziyann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lingziyann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3ALingZiyann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ONG ..TTIS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/mattisongjj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mattisongjj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/mattisongjj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/mattisongjj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=mattisongjj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Amattisongjj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..EONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tckeong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tckeong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/tckeong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/tckeong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tckeong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Atckeong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("VINC.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/vinceg4"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("vinceg4")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F10-4.github.io/tp/images/vinceg4.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F10-4.github.io/tp/team/vinceg4.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vinceg4&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F10-4/tp/pulls?q=is%3Apr+author%3Avinceg4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f10"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f10"}},[_v("CS2103-F10"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f10-1-supplycentral"}},[_v("CS2103-F10-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F10-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F10-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SupplyCentral]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10-1-supplycentral","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA Business owner managing a small sized company who frequently procures goods from suppliers.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOne-stop solution for small business owners to keep track of their contracted suppliers, along with any other relevant business information such as purchased goods & services, dates and other potential waybill information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1C4nZ49QlduXBYTzFtu_DTt-1gqi-RDrIC-jfhInUSRk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ABIC..ARAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/thenosewizard"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("thenosewizard")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/thenosewizard.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/thenosewizard.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=thenosewizard&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Athenosewizard"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. LIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ossaris56"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ossaris56")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/ossaris56.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/ossaris56.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ossaris56&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Aossaris56"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEON..HANE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/stephaneleong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("stephaneleong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/stephaneleong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/stephaneleong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=stephaneleong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Astephaneleong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..IALE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jialegitgud"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jialegitgud")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/jialegitgud.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/jialegitgud.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jialegitgud&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Ajialegitgud"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEE ..HWEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yanhwee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yanhwee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-1.github.io/tp/images/yanhwee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-1.github.io/tp/team/yanhwee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yanhwee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-1/tp/pulls?q=is%3Apr+author%3Ayanhwee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f10-2-socialbook"}},[_v("CS2103-F10-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F10-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F10-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SocialBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10-2-socialbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSocial worker\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nthe address book acts as an easy way to locate/contact families,and keep track of how long it has been since their last visit.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Z8T1fEUBexSmQ5XOu-H0NQqsuJgwNjvYGSuWGYpPWQE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AL R..AD A")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AbdulrahmanAlRammah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AbdulrahmanAlRammah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/abdulrahmanalrammah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/abdulrahmanalrammah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=abdulrahmanalrammah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3AAbdulrahmanAlRammah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANDR..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Andrew22Teoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Andrew22Teoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/andrew22teoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/andrew22teoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=andrew22teoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3AAndrew22Teoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..HAEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Rachael-Chan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Rachael-Chan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/rachael-chan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/rachael-chan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rachael-chan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3ARachael-Chan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIAU..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/liauzhanyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("liauzhanyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/liauzhanyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/liauzhanyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=liauzhanyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3Aliauzhanyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAYN.. YUH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rayray39"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rayray39")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-2.github.io/tp/images/rayray39.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-2.github.io/tp/team/rayray39.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rayray39&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-2/tp/pulls?q=is%3Apr+author%3Arayray39"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f10-3-bizbook"}},[_v("CS2103-F10-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F10-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F10-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("BizBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f10-3-bizbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nStore managers in the Food and Beverage industry who are responsible for managing contacts for Sales and Delivery.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product aims to streamline and simplify sales and delivery management for Food and Beverage outlets. By providing an organized, easy-to-use platform for managing business contacts, it helps store managers save time and improve efficiency, ensuring smooth coordination between sales and delivery operations.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1EeGK4QJTxPBJMFeEeBwHVqvk93lwqeEUr8LtCIDDeBk"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOEL.. HON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/joeltio"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("joeltio")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/joeltio.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/joeltio.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=joeltio&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3Ajoeltio"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KENN.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KennethTeo2002"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KennethTeo2002")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/kennethteo2002.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/kennethteo2002.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kennethteo2002&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3AKennethTeo2002"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ITLimJiaWei"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ITLimJiaWei")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/itlimjiawei.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/itlimjiawei.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=itlimjiawei&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3AITLimJiaWei"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NICH.. FEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Nicholas-Cheng-De-Fei"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Nicholas-Cheng-De-Fei")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/nicholas-cheng-de-fei.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/nicholas-cheng-de-fei.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nicholas-cheng-de-fei&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3ANicholas-Cheng-De-Fei"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..KERR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sheenkerr"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sheenkerr")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F10-3.github.io/tp/images/sheenkerr.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F10-3.github.io/tp/team/sheenkerr.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sheenkerr&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F10-3/tp/pulls?q=is%3Apr+author%3Asheenkerr"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f11"}},[_v("CS2103T-F11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-1-concertphonebook"}},[_v("CS2103T-F11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ConcertPhonebook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-1-concertphonebook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nConcert organisers who prefer CLI over GUI and have a lot of contacts to keep track of.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAllows concert organisers to add, delete and quickly sift through many contacts, from whom to obtain required resources or fulfil their professional obligations. Contacts have categories, such as band, audience, and staff. It provides an efficient CLI optimised for fast typists, complemented by an interactive GUI for convenience.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1PXDrMpuVDXDr4VTyzfX0dRvDQu-XaHrdfzdiQluigNk/edit?usp=drivesdk"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KART..ARAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/karthickkc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("karthickkc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/karthickkc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/karthickkc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=karthickkc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Akarthickkc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG H..JING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hj235"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hj235")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/hj235.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/hj235.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hj235&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Ahj235"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUBR..EYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SKarthikeyan28"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SKarthikeyan28")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/skarthikeyan28.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/skarthikeyan28.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=skarthikeyan28&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3ASKarthikeyan28"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG..SLEY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wes-w-z-h"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wes-w-z-h")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/wes-w-z-h.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/wes-w-z-h.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wes-w-z-h&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Awes-w-z-h"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZACH..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/bbbbcccd"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("bbbbcccd")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-1.github.io/tp/images/bbbbcccd.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-1.github.io/tp/team/bbbbcccd.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bbbbcccd&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-1/tp/pulls?q=is%3Apr+author%3Abbbbcccd"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-2-ccaconnect"}},[_v("CS2103T-F11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CCAConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-2-ccaconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThe product is for CCA leaders in NUS who want to manage contact details of all relevant CCA personnel\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur project aims to assist CCA leaders in NUS in managing and collating relevant CCA personnel’s contact details. This is done via a clean user interface with fast access to the contact information of relevant CCA personnel, providing users a one-stop solution to help manage CCA manpower related considerations.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1tHwA5ZRhEGfuIXDfa_Q7J5rIyAiUz8k4QNvcsi1k08c/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CAI ..NXIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Rachelcoll"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Rachelcoll")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/rachelcoll.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/rachelcoll.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rachelcoll&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3ARachelcoll"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CALE..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/superb-sushi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("superb-sushi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/superb-sushi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/superb-sushi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=superb-sushi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Asuperb-sushi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOI.. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yyihaoc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yyihaoc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/yyihaoc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/yyihaoc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yyihaoc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Ayyihaoc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHI ..YUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shizy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shizy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/shizy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/shizy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shizy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Ashizy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..LIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weiliann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weiliann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-2.github.io/tp/images/weiliann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-2.github.io/tp/team/weiliann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weiliann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-2/tp/pulls?q=is%3Apr+author%3Aweiliann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-3-clinicbuddy"}},[_v("CS2103T-F11-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ClinicBuddy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-3-clinicbuddy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHealthcare professionals in small clinics, such as doctors, nurses, and administrative staff, who need an organized system for managing patient records, treatment plans, and future appointments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSmall, private clinics do not have access to advanced administration systems to manage patients as they are expensive and meant for bigger hospitals. ClinicBuddy enhances the patient management process for small clinics, creating a platform to track patient information such as their treatment, contact information, visit records and future appointments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1iIWqfy7Od1ldygLRqYYVT8ugG6S5umBvIUAwiAQSALo/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALEZ.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Al-ez"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Al-ez")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/al-ez.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/al-ez.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=al-ez&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AAl-ez"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIA..ADAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/colinac"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("colinac")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/colinac.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/colinac.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=colinac&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3Acolinac"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAYN.. KAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jaynon"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jaynon")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/jaynon.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/jaynon.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jaynon&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AJaynon"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SUN ..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ArtillerySun"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ArtillerySun")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/artillerysun.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/artillerysun.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=artillerysun&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AArtillerySun"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEA .. HAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JellyPenguinnn"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JellyPenguinnn")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-3.github.io/tp/images/jellypenguinnn.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-3.github.io/tp/team/jellypenguinnn.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jellypenguinnn&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-3/tp/pulls?q=is%3Apr+author%3AJellyPenguinnn"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f11-4-ezstates"}},[_v("CS2103T-F11-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F11-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F11-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EZSTATES]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f11-4-ezstates","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for freelance real estate agents who have to manage numerous property transactions and client interactions. It caters to those who need a fast, efficient tool to organize all their client data, track deals, and wish to streamline their workflow through command-line operations.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEZSTATES provides freelance real estate agents quick access to client details, categorized by their property’s needs and interests through a user-friendly CLI, streamlining operations by enabling swift and intuitive command-line interactions. This simplifies their workflow, boosts efficiency and enhances their client service.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1I1U7cg7SjBzk0UVz-yVcWPW7D1aP3xKOEicpqHcjF-w/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LAM ..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lrongyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lrongyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/lrongyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/lrongyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lrongyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Alrongyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..MZAH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/muhdbhz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("muhdbhz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/muhdbhz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/muhdbhz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=muhdbhz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Amuhdbhz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEAN..DIAS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seandias"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seandias")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/seandias.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/seandias.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seandias&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Aseandias"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/e1121208"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1121208")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/e1121208.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/e1121208.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=e1121208&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Ae1121208"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..ZHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wang-h-z"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wang-h-z")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F11-4.github.io/tp/images/wang-h-z.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F11-4.github.io/tp/team/wang-h-z.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wang-h-z&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F11-4/tp/pulls?q=is%3Apr+author%3Awang-h-z"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f11"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f11"}},[_v("CS2103-F11"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f11","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f11-1-tachy"}},[_v("CS2103-F11-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F11-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F11-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAchy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f11-1-tachy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTech-savvy Tuition Teachers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProvide a fast CLI for tutors to manage and track students' work and submissions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/173iNEF6egbVOLGqyoM7d2-h1G-U3ypUazlNacIftgY8/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALTH.. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/althea28"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("althea28")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/althea28.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/althea28.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=althea28&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Aalthea28"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AVRI..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/avrilmohh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("avrilmohh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/avrilmohh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/avrilmohh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=avrilmohh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Aavrilmohh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("EMMA.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/emmannyyy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("emmannyyy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/emmannyyy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/emmannyyy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=emmannyyy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Aemmannyyy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JIAN..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jian7490"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jian7490")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/jian7490.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/jian7490.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jian7490&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Ajian7490"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAU .. TOM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lm-44"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lm-44")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-1.github.io/tp/images/lm-44.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-1.github.io/tp/team/lm-44.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lm-44&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-1/tp/pulls?q=is%3Apr+author%3Alm-44"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f11-2-tutorease"}},[_v("CS2103-F11-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F11-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F11-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TutorEase]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f11-2-tutorease","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for freelance pre-university home tutors who prefer CLI over GUI and must keep track of many students, student locations and schedules\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur software enhances tutoring efficiency by simplifying management tasks, reducing scheduling conflicts, and providing a clear overview of classes and finances. It enables seamless tutor coordination with students and parents, improving communication and organization, ultimately leading to a more effective and stress-free educational experience.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1FqN1gEOUkQg225T_amdpwm85VyLXHTgUws6inysdl1Y/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AW J..RIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Chronoxy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Chronoxy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/chronoxy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/chronoxy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chronoxy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3AChronoxy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOH ..BERT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NorbertLoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NorbertLoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/norbertloh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/norbertloh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=norbertloh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3ANorbertLoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW .. IAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/"}},[_v("``")])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3A"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MA X..XIZI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Ma-Xizi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ma-Xizi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/ma-xizi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/ma-xizi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ma-xizi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3AMa-Xizi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..THAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ethantyh692"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ethantyh692")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F11-2.github.io/tp/images/ethantyh692.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F11-2.github.io/tp/team/ethantyh692.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethantyh692&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F11-2/tp/pulls?q=is%3Apr+author%3Aethantyh692"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f12"}},[_v("CS2103-F12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-1-insureance"}},[_v("CS2103-F12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("InSUREance]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-1-insureance","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nNew Insurance Agents with a preference for typing instead of using point and click. Has many different priority customers with diverse backgrounds and types of insurance. The app should also help the insurance agent keep track of their customers claims and appointments.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur apps help insurance agents keep track of new and existing clients. This allows them to maximise their reach to their contacts and optimise their profits each month.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://drive.google.com/drive/folders/1tUMTjtYdslE0APgtso1N3M9x30g9Dz8Y"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zi-yii"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zi-yii")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/zi-yii.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/zi-yii.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zi-yii&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3Azi-yii"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HO Y..N QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yanqiyqh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yanqiyqh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/yanqiyqh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/yanqiyqh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yanqiyqh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3Ayanqiyqh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MATT..ERNG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/matthewyip1511"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("matthewyip1511")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/matthewyip1511.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/matthewyip1511.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=matthewyip1511&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3Amatthewyip1511"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("REZW..HMED")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/RezwanAhmed123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("RezwanAhmed123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-1.github.io/tp/images/rezwanahmed123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-1.github.io/tp/team/rezwanahmed123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rezwanahmed123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-1/tp/pulls?q=is%3Apr+author%3ARezwanAhmed123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-2-t-assistant"}},[_v("CS2103-F12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("T_Assistant]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-2-t-assistant","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for TAs in group project based courses, who prefer CLI over GUI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHelps to track the following: - Students - Their groups - Group projects’ progress - TA will create projects and tasks related to the projects - Then assign the projects to groups - Mark the tasks as the groups complete - Identify those who are falling behind\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1abBcDGnCER1RR_Wmai2G_S8zSHXi7TnFVgMYTsmcEa4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LYE ..EWIS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ghos7ie"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ghos7ie")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/ghos7ie.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/ghos7ie.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ghos7ie&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3Aghos7ie"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SNG ..IREE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dez2003"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dez2003")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/dez2003.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/dez2003.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dez2003&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3Adez2003"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN .. YAP")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SooYap"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SooYap")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/sooyap.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/sooyap.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sooyap&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3ASooYap"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WANG..NYAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/YANYAN-w"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YANYAN-w")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-2.github.io/tp/images/yanyan-w.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-2.github.io/tp/team/yanyan-w.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yanyan-w&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-2/tp/pulls?q=is%3Apr+author%3AYANYAN-w"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-3-grub"}},[_v("CS2103-F12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Grub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-3-grub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nDiners\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIt offers a curated list of nearby restaurants tailored to your preferences, ensuring quick and efficient searches for local dining options.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ar2yfvC_m2KPvZ7QgLoyePJw-NtzQ5IkBMs6d6sMV5s/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMAD..SUMA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AmadeusEka"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AmadeusEka")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/amadeuseka.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/amadeuseka.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=amadeuseka&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3AAmadeusEka"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JAGD..NDAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JagdeepSinghNUS"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JagdeepSinghNUS")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/jagdeepsinghnus.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/jagdeepsinghnus.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jagdeepsinghnus&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3AJagdeepSinghNUS"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SAW .. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/shotnothing"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("shotnothing")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/shotnothing.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/shotnothing.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shotnothing&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3Ashotnothing"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. HAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/WeiHanWong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("WeiHanWong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-3.github.io/tp/images/weihanwong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-3.github.io/tp/team/weihanwong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weihanwong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-3/tp/pulls?q=is%3Apr+author%3AWeiHanWong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f12-4-studentmanagerpro"}},[_v("CS2103-F12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("StudentManagerPro]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f12-4-studentmanagerpro","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nsecondary school teachers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA teacher is normally assigned to a large number of students making it hard for them to keep track of all the students/project groups at once. With our product, they can track all of the students’ test scores, submissions, progress and also, access their particulars with ease.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/13vXn46JN8OUtpjXW-YA0XyzMhG3Xp5y15O6kLEwxJH4/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA.. HEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jason-chuah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jason-chuah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/jason-chuah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/jason-chuah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jason-chuah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3Ajason-chuah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOH ..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gohqingkhang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gohqingkhang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/gohqingkhang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/gohqingkhang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gohqingkhang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3Agohqingkhang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MURA..UTHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Shruthiiii03"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Shruthiiii03")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/shruthiiii03.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/shruthiiii03.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shruthiiii03&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3AShruthiiii03"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..ENRY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Tanziyanghenry"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tanziyanghenry")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/tanziyanghenry.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/tanziyanghenry.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tanziyanghenry&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3ATanziyanghenry"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TENG..LOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/BunnyHoppp"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("BunnyHoppp")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F12-4.github.io/tp/images/bunnyhoppp.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F12-4.github.io/tp/team/bunnyhoppp.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=bunnyhoppp&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F12-4/tp/pulls?q=is%3Apr+author%3ABunnyHoppp"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f12"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f12"}},[_v("CS2103T-F12"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-1-contactcs"}},[_v("CS2103T-F12-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ContactCS]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-1-contactcs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for NUS CS freshmen who are unfamiliar with the school system and find it frustrating to gather contacts from all types of platforms.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product allows NUS CS freshmen to easily locate the admin contact details when needed, which helps them better manage contact details of their professors, classmates, CCA mates, offices, emergency helplines, etc. so that they can focus more on their study.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://nusu.sharepoint.com/:w:/s/CS2103TG19ProjectGroup535/Eao0muS8ZVdOvngA5QROmSAB2I1DsKzC9kNXjvAz8W_ndw?e=ESWQ1b"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ELIN..G EE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Elinengu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Elinengu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/elinengu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/elinengu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=elinengu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3AElinengu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HUAN..IAXI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/huangjiaxi1111"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("huangjiaxi1111")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/huangjiaxi1111.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/huangjiaxi1111.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=huangjiaxi1111&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3Ahuangjiaxi1111"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAO ..GKAI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/MAOXIONGKAI"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MAOXIONGKAI")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/maoxiongkai.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/maoxiongkai.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=maoxiongkai&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3AMAOXIONGKAI"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..SENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/weiseng18"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("weiseng18")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/weiseng18.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/weiseng18.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=weiseng18&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3Aweiseng18"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHU ..ANYI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/lithops-zty"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("lithops-zty")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-1.github.io/tp/images/lithops-zty.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-1.github.io/tp/team/lithops-zty.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=lithops-zty&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-1/tp/pulls?q=is%3Apr+author%3Alithops-zty"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-2-educonnect"}},[_v("CS2103T-F12-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-2-educonnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for teachers looking to manage their students' details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\n- Add, edit and delete chunks of information quickly - Typos are forgiving and there will be no need to backtrack using backspace, you can just keep going - Effective use of screen real estate - Can be used without using the mouse at all - Customizable commands - Easily share contacts (ie copy paste)\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1D_VlYtPQ-Ebi6ZTv5rwy0xuv8u5m4S0n7YwikGMkZFc/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ADRI..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AgentHagu"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AgentHagu")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/agenthagu.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/agenthagu.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=agenthagu&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3AAgentHagu"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AMOS..N EE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/amoschee"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("amoschee")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/amoschee.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/amoschee.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=amoschee&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3Aamoschee"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GARG..JESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/maahir-garg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("maahir-garg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/maahir-garg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/maahir-garg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=maahir-garg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3Amaahir-garg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GOEL..RNAV")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Arnaxx54"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Arnaxx54")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/arnaxx54.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/arnaxx54.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arnaxx54&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3AArnaxx54"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NIHA..MESH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nihalramesh12629"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nihalramesh12629")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-2.github.io/tp/images/nihalramesh12629.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-2.github.io/tp/team/nihalramesh12629.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nihalramesh12629&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-2/tp/pulls?q=is%3Apr+author%3Anihalramesh12629"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-3-medibase3"}},[_v("CS2103T-F12-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("MediBase3]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-3-medibase3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for doctors who might want to keep track of their patient's history, reports and appointments. Since doctor's are busy focusing on their patients, they would prefer typing their patient's details to save time.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nMake it easier for doctors to keep track of their patients progress and appointment timings. This will improve their overall efficiency and improve their work life balance, as doctors are some of the most overworked professions in Singapore.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1YLYrqKEbtA8UyGKtJOISQjCPZbvU7-Hj-afOBjj6r9Q/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HO W..NIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hweinian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hweinian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/hweinian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/hweinian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hweinian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3Ahweinian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRES.. LUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/PresleyChew"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PresleyChew")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/presleychew.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/presleychew.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=presleychew&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3APresleyChew"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SIVA..KRAJ")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TechRaj"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TechRaj")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/techraj.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/techraj.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=techraj&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3ATechRaj"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YAP ..ZHUO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yong-zhuo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yong-zhuo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/yong-zhuo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/yong-zhuo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yong-zhuo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3Ayong-zhuo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YUKN..AJAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yadobler"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yadobler")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-3.github.io/tp/images/yadobler.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-3.github.io/tp/team/yadobler.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yadobler&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-3/tp/pulls?q=is%3Apr+author%3Ayadobler"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f12-4-vbook"}},[_v("CS2103T-F12-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F12-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F12-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("VBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f12-4-vbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for freelance software developers who value privacy and self-hosting, preferring typing over mouse actions.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA secure, intuitive contact management system tailored for developers, offering seamless integration between command-line efficiency and UI simplicity. It prioritizes data privacy, allowing users to manage and protect their contacts with minimal friction.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/19VMS2xwpYiRJs3xH4eaFqOt96IY67BTCt48Qx2XVtG0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANSE..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/anselmlong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("anselmlong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/anselmlong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/anselmlong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=anselmlong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Aanselmlong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LERO..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leroytan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leroytan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/leroytan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/leroytan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leroytan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Aleroytan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MUHA..LLAH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/raihahahan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("raihahahan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/raihahahan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/raihahahan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=raihahahan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Araihahahan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RACH.. MIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rachelyeohm"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rachelyeohm")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F12-4.github.io/tp/images/rachelyeohm.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F12-4.github.io/tp/team/rachelyeohm.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rachelyeohm&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F12-4/tp/pulls?q=is%3Apr+author%3Arachelyeohm"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f13"}},[_v("CS2103T-F13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-1-tahub"}},[_v("CS2103T-F13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAHub]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-1-tahub","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTeaching Assistants (TAs) in academic institutions such as universities, colleges, and online learning platforms. - Role: TAs supporting professors and lecturers in managing course-related tasks. - Experience Level: New and experienced TAs handling multiple responsibilities. - Needs: Efficient management of student information and tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAHub simplifies the role of Teaching Assistants by providing a centralized hub to organize student information, and efficiently manage course-related tasks. This platform empowers TAs to focus more on enhancing student learning and less on administrative chaos.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/17hPaYDArariN7ejrwdR_VKaECxcdmz_MpXdfo0zxgp0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ANG ..RCUS")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/marcusjhang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("marcusjhang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/marcusjhang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/marcusjhang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=marcusjhang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3Amarcusjhang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAXI.. LEE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/notnotmax"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("notnotmax")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/notnotmax.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/notnotmax.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=notnotmax&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3Anotnotmax"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SKY ..I YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/S-K-Y-Light"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("S-K-Y-Light")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/s-k-y-light.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/s-k-y-light.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=s-k-y-light&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3AS-K-Y-Light"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEO ..ENCE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Clarenceeey"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Clarenceeey")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/clarenceeey.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/clarenceeey.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=clarenceeey&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3AClarenceeey"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEOH..N YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yhanyi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yhanyi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-1.github.io/tp/images/yhanyi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-1.github.io/tp/team/yhanyi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yhanyi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-1/tp/pulls?q=is%3Apr+author%3Ayhanyi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-2-abcli"}},[_v("CS2103T-F13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ABCLI]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-2-abcli","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nReal estate agents with many clients to manage and require frequent updating and tracking of client information.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nABCLI helps real estate agents manage their client contacts and schedules, and assists with outbound communication, creating a seamless and client-focused workflow.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://nusu-my.sharepoint.com/:w:/r/personal/e1157106_u_nus_edu/_layouts/15/Doc.aspx?sourcedoc=%7BF573890E-06D2-4118-951A-CE05DCF03635%7D&file=CS2103_tP_Notes.docx&fromShare=true&action=default&mobileredirect=true"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN..LING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ylchin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ylchin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/ylchin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/ylchin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ylchin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3Aylchin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KENN..LEWI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KennyLewi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KennyLewi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/kennylewi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/kennylewi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kennylewi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3AKennyLewi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG E..SWEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Solomon0519"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Solomon0519")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/solomon0519.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/solomon0519.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=solomon0519&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3ASolomon0519"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Z.. XIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/NgZiXin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NgZiXin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/ngzixin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/ngzixin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ngzixin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3ANgZiXin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YIOW..OONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/CreditableX"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CreditableX")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-2.github.io/tp/images/creditablex.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-2.github.io/tp/team/creditablex.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=creditablex&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-2/tp/pulls?q=is%3Apr+author%3ACreditableX"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-3-dream-day-designer"}},[_v("CS2103T-F13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Dream Day Designer]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-3-dream-day-designer","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is targeted at wedding planners who have many contacts of vendors and clients to keep track of when planning the different weddings.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur product provides a way to easily select suitable vendors and freelancers for a wedding event given specific parameters such as budget, time, commission, client needs (culture, style), location.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1VQudW2Kwq3_AzUwQ_z0N0t7sWta-hAXWU7saNc85970/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..HONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yizhong187"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yizhong187")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/yizhong187.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/yizhong187.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yizhong187&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3Ayizhong187"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FENG..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FYL2003"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FYL2003")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/fyl2003.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/fyl2003.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fyl2003&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3AFYL2003"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MERV.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Teddayz"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Teddayz")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/teddayz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/teddayz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=teddayz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3ATeddayz"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG E..SPER")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/casperngeen"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("casperngeen")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/casperngeen.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/casperngeen.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=casperngeen&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3Acasperngeen"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YIP ..SLIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/leslieyip02"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("leslieyip02")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-3.github.io/tp/images/leslieyip02.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-3.github.io/tp/team/leslieyip02.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leslieyip02&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-3/tp/pulls?q=is%3Apr+author%3Aleslieyip02"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f13-4-clientell"}},[_v("CS2103T-F13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Clientell]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f13-4-clientell","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFreelance consultants who prefer CLI over GUI and who are managing a large number of clients across various different (and possibly cross-related) industries.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nsimplifies managing diverse client contact information by offering fast, precise, and more customisable searching functionality. It also provides robust tag management for hierarchical relationships, making it easier to categorise and retrieve clients (useful for users with clients across multiple cross-related industries), and optimised for CLI users for speed and efficiency.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1ueNiBphT3fm_Ov47hA1vsiWPZO0FLAigU6DcAV-MTxk/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHIN.. JAK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/darkmoongreatsword"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("darkmoongreatsword")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/darkmoongreatsword.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/darkmoongreatsword.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=darkmoongreatsword&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Adarkmoongreatsword"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. RUI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/beginner-web-developer"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("beginner-web-developer")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/beginner-web-developer.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/beginner-web-developer.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=beginner-web-developer&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Abeginner-web-developer"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG Y..STIA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kngys"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kngys")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/kngys.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/kngys.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kngys&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Akngys"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEH ..CHUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/reginateh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reginateh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/reginateh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/reginateh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=reginateh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Areginateh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TRAN..C MY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/trpmy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("trpmy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F13-4.github.io/tp/images/trpmy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F13-4.github.io/tp/team/trpmy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=trpmy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F13-4/tp/pulls?q=is%3Apr+author%3Atrpmy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103-f13"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103-f13"}},[_v("CS2103-F13"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-1-spleetwaise"}},[_v("CS2103-F13-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SpleetWaise]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-1-spleetwaise","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTech-savvy students looking to track shared expenses and manage who owes what.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSpleetWaise simplifies expense tracking for students, making it easy to split and manage shared costs. By offering a seamless solution to track who owes what, it eliminates the stress and confusion that often come with shared expenses, ensuring clarity and peace of mind for students who use SpleetWaise.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/wiki"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DONG..ANBO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rollingpencil"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rollingpencil")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/rollingpencil.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/rollingpencil.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rollingpencil&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3Arollingpencil"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("GAVI..CHEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/GavinSin"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GavinSin")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/gavinsin.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/gavinsin.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gavinsin&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3AGavinSin"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HE Y..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Dino-Nuggies"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Dino-Nuggies")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/dino-nuggies.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/dino-nuggies.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dino-nuggies&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3ADino-Nuggies"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..SEAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/seanlim"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seanlim")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/seanlim.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/seanlim.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seanlim&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3Aseanlim"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SEE .. ZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/SeeYangZhi"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SeeYangZhi")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-1.github.io/tp/images/seeyangzhi.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-1.github.io/tp/team/seeyangzhi.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=seeyangzhi&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-1/tp/pulls?q=is%3Apr+author%3ASeeYangZhi"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-2-eventtory"}},[_v("CS2103-F13-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EventTory]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-2-eventtory","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIndividuals responsible for planning and managing events such as corporate event managers, wedding planners, and social event coordinators, who need to communicate with multiple stakeholders.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEventTory simplifies the process of organizing events, from small gatherings to large-scale corporate functions, and is optimized for users who prefer a CLI-like interface. EventTory provides them with the ability to track event details and contact information for various vendors, allowing them to manage the status of multiple events concurrently.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Edv70omuqqv8wgLOaFbbiB4bymznlzsWUmo-re3IzoU/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..SUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kahsuann"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kahsuann")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/kahsuann.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/kahsuann.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kahsuann&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3Akahsuann"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("HANS..LANO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/hanscau"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("hanscau")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/hanscau.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/hanscau.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hanscau&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3Ahanscau"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JABE..E QI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Jasperabez"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Jasperabez")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/jasperabez.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/jasperabez.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jasperabez&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3AJasperabez"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KEVI..TING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kevin-pek"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kevin-pek")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/kevin-pek.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/kevin-pek.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kevin-pek&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3Akevin-pek"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("KOK ..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/C5hives"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("C5hives")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-2.github.io/tp/images/c5hives.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-2.github.io/tp/team/c5hives.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=c5hives&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-2/tp/pulls?q=is%3Apr+author%3AC5hives"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-3-seeree-2-0"}},[_v("CS2103-F13-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SeeRee 2.0]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-3-seeree-2-0","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nBusy Students and Professionals with a need to coordinate available meeting times with their contacts.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur application helps to coordinate meeting timings with relevant contacts, by keeping track of the schedules of the user’s contacts. This will be very useful for busy Students and Professionals that have many meetings with different people throughout the day. By making the commands similar to Natural Language, our application aims to provide a user-centric experience. The ease of use would make the product an attractive alternative to current Calendar applications that require the user to navigate multiple screens and input their meetings....\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1kmMHSzOK3H3Vziouc9pYdY1b4pc5hdhhwBTHLuZakcY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BREN..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Brendan8899"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Brendan8899")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/brendan8899.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/brendan8899.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=brendan8899&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3ABrendan8899"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM .. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LimKaiWei"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LimKaiWei")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/limkaiwei.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/limkaiwei.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=limkaiwei&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3ALimKaiWei"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NON ..ANON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tata32000"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tata32000")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/tata32000.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/tata32000.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tata32000&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3Atata32000"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("QUEK..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/QuekBingHeng"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("QuekBingHeng")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/quekbingheng.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/quekbingheng.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=quekbingheng&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3AQuekBingHeng"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..JEWI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jewiteo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jewiteo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-3.github.io/tp/images/jewiteo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-3.github.io/tp/team/jewiteo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jewiteo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-3/tp/pulls?q=is%3Apr+author%3Ajewiteo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103-f13-4-talentconnect"}},[_v("CS2103-F13-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103-F13-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103-F13-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TalentConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103-f13-4-talentconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor solo, freelance third party recruiters that need to keep track of many candidates (and their details) and job listings (with their requirements). The target users wants a free and lightweight CLI-optimized address book with features that help in matching candidates with jobs, all neatly packaged in a minimalistic GUI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA free and lightweight app designed for CLI users in mind - core functionality of managing contacts can be done much faster than GUI alternatives. Useful features for quick matching of candidates to jobs are provided. Our GUI would display only necessary information yet still look polished.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1KV_WDDNJqaDxJtrWP3OXHmIpyDjgjYTapq-vDgd6GsQ/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ALEK..KWEK")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AlekKwek18"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AlekKwek18")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/alekkwek18.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/alekkwek18.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=alekkwek18&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AAlekKwek18"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BENJ.. NAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Quasant"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Quasant")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/quasant.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/quasant.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=quasant&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AQuasant"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAU .. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/wassilililily"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("wassilililily")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/wassilililily.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/wassilililily.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=wassilililily&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3Awassilililily"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOO ..BOON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Green-Tea-123"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Green-Tea-123")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/green-tea-123.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/green-tea-123.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=green-tea-123&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AGreen-Tea-123"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH ..HIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KengHian"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KengHian")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103-F13-4.github.io/tp/images/kenghian.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103-F13-4.github.io/tp/team/kenghian.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kenghian&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103-F13-4/tp/pulls?q=is%3Apr+author%3AKengHian"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f15"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f15"}},[_v("CS2103T-F15"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-1-novacare"}},[_v("CS2103T-F15-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("NovaCare]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-1-novacare","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for nurses that have tp eals with different kind of patients and each patient has a list of tasks associated with it\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nHealthcare personnel face many duties under a high stress environment, and they need a system to document details efficiently. Organised Patient Care: Manage contact details, schedules, important notes for each patient Task Management: Provides alerts for critical tasks (administering medication etc) Critical Insights: Dashboard with patient data and task overviews\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1J0h2tOMQ2auT5KZi19A6w3Nvyvw77199bE7jGKffRm0/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHON.. WEI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/xinweichong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("xinweichong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/xinweichong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/xinweichong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=xinweichong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Axinweichong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHOO..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yixianggg"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yixianggg")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/yixianggg.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/yixianggg.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yixianggg&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Ayixianggg"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JARR..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jarrellc1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jarrellc1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/jarrellc1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/jarrellc1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jarrellc1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Ajarrellc1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..AMIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/benjiBase"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("benjiBase")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/benjibase.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/benjibase.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=benjibase&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3AbenjiBase"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOH ..AVIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/gavinsoh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("gavinsoh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-1.github.io/tp/images/gavinsoh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-1.github.io/tp/team/gavinsoh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gavinsoh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-1/tp/pulls?q=is%3Apr+author%3Agavinsoh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-2-educontacts"}},[_v("CS2103T-F15-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("EduContacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-2-educontacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTertiary Teachers and Educators\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAn address book tailored for educators simplifies student and parent contact management, enhances communication tracking, and integrates progress reports, helping teachers save time and foster effective collaboration across the school community.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Vvv2CarGU4TyzEtrbAHxWY989MA4tHzrHfrQqT2nO5E/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ETHA.. ERN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/ethan-goh"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ethan-goh")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/ethan-goh.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/ethan-goh.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ethan-goh&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Aethan-goh"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JESS..TEJA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jessica2828"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jessica2828")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/jessica2828.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/jessica2828.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jessica2828&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Ajessica2828"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEE ..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JYL27"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JYL27")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/jyl27.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/jyl27.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jyl27&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3AJYL27"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..NDON")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/btbrandon"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("btbrandon")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/btbrandon.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/btbrandon.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=btbrandon&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Abtbrandon"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAY ..LIAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/juliantayyc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("juliantayyc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-2.github.io/tp/images/juliantayyc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-2.github.io/tp/team/juliantayyc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=juliantayyc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-2/tp/pulls?q=is%3Apr+author%3Ajuliantayyc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-3-property"}},[_v("CS2103T-F15-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("PROperty]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-3-property","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProperty agents responsibilities include managing a large list of property listings, coordinating with clients and potential buyers, conducting property viewings, negotiating deals, and handling paperwork related to real estate transactions. They are often mobile, needing quick and easy access to information, and manage a large client and property database.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAgents often have difficulty keeping track of the large client and property database. Our address book allows property agents to manage prospective and existing customers by sorting them into different categories including housing type and income level. Moreover, they can keep track of house visits via an events management system.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1vl9Nw4C39E6JwXAGLu2UfAQoxjWNk8XE-Nj9su4oYjM/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DYLA.. LAM")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Vatinius"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Vatinius")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/vatinius.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/vatinius.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=vatinius&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3AVatinius"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LOW ..HENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/BuffWuff1712"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("BuffWuff1712")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/buffwuff1712.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/buffwuff1712.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=buffwuff1712&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3ABuffWuff1712"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAY ..N YE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tayxuenye"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tayxuenye")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/tayxuenye.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/tayxuenye.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tayxuenye&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3Atayxuenye"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TEO ..IANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Tkaixiang"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tkaixiang")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/tkaixiang.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/tkaixiang.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tkaixiang&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3ATkaixiang"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZHAN.. YAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/sayomaki"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("sayomaki")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-3.github.io/tp/images/sayomaki.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-3.github.io/tp/team/sayomaki.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=sayomaki&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-3/tp/pulls?q=is%3Apr+author%3Asayomaki"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f15-4-wedlinker"}},[_v("CS2103T-F15-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F15-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F15-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("WedLinker]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f15-4-wedlinker","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nProfessional wedding planners who coordinate with a variety of vendors, venues, and clients across different locations for a wedding, and prefer to quickly retrieve and process contact data using text-based commands.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSimplifies managing wedding-related contacts through text-based commands by providing a centralized address book designed to efficiently handle the complexities of coordinating with multiple vendors, venues, and clients, while streamlining communication and event planning tasks.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1LdstNiC-RPVcMKvYaNvcAtYgJAx4FuWH09uT6pKvMsE/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DANZ.. ZHE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DanzaSeah"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DanzaSeah")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/danzaseah.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/danzaseah.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=danzaseah&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3ADanzaSeah"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NGIO.. BIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/HanB1n"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("HanB1n")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/hanb1n.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/hanb1n.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=hanb1n&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3AHanB1n"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PEH ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tingxuanp"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tingxuanp")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/tingxuanp.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/tingxuanp.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tingxuanp&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3Atingxuanp"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RICC..N YU")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/riccoljy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("riccoljy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/riccoljy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/riccoljy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=riccoljy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3Ariccoljy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SYCH..ASHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/dasha3412"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dasha3412")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F15-4.github.io/tp/images/dasha3412.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F15-4.github.io/tp/team/dasha3412.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dasha3412&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F15-4/tp/pulls?q=is%3Apr+author%3Adasha3412"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f14a"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f14a"}},[_v("CS2103T-F14a"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-1-ugteach"}},[_v("CS2103T-F14a-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("UGTeach]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-1-ugteach","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur CLI-based address book empowers undergraduate private tutors to efficiently manage payments and organize schedules. It streamlines tutoring operations and ensures you stay organized. It is optimized for users who prefer CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur CLI-based address book empowers undergraduate private tutors to efficiently manage payments, track student performance, and organize schedules. It streamlines tutoring operations, ensuring you stay organized and focused on helping your students achieve their academic goals. It is optimized for users who prefer CLI\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1KX_qw-7SBZClJHja27qpCasQu5f_gv3x2GJLuymFYsY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..FENG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Feng1231"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Feng1231")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/feng1231.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/feng1231.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=feng1231&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3AFeng1231"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("DINH.. DAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/DennieDan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DennieDan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/denniedan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/denniedan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=denniedan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3ADennieDan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SOUM..SAHA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Soumyadip-cmd"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Soumyadip-cmd")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/soumyadip-cmd.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/soumyadip-cmd.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=soumyadip-cmd&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3ASoumyadip-cmd"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TIMO.. TAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/teamotitan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("teamotitan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/teamotitan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/teamotitan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=teamotitan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3Ateamotitan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TOH .. FAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TY1Fan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TY1Fan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/images/ty1fan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-1.github.io/tp/team/ty1fan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=ty1fan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-1/tp/pulls?q=is%3Apr+author%3ATY1Fan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-2-sellsavvy"}},[_v("CS2103T-F14a-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SellSavvy]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-2-sellsavvy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nIndependent sellers/dropshipping business owners selling on platforms like Carousell, who lack a central platform for dropshipping and delivery order management.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFor small independent sellers, organizing client lists can be challenging. SellSavvy offers a centralized platform to store orders and track deliveries, streamlining dropshipping management. SellSavvy is optimized for tech-savvy fast-typing users through command-line interface and efficient functionalities.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Wg3O8x3wIcT9QLpzhvF91LW2vmLvLPR3dztPVMFfktM/edit?usp=drivesdk"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("FOO ..CHAO")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FooChao"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooChao")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/foochao.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/foochao.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=foochao&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3AFooChao"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/kaixuan477"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("kaixuan477")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/kaixuan477.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/kaixuan477.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=kaixuan477&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3Akaixuan477"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG K..YANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/awdse22"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("awdse22")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/awdse22.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/awdse22.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=awdse22&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3Aawdse22"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YU S..TONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yu-sutong"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yu-sutong")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/images/yu-sutong.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-2.github.io/tp/team/yu-sutong.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yu-sutong&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-2/tp/pulls?q=is%3Apr+author%3Ayu-sutong"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-3-clientele"}},[_v("CS2103T-F14a-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Clientele+]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-3-clientele","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nFreelance software developers\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nInstead of using separate apps for meetings, contacts, and payments, use our app to track client contacts, payments, and job referrals, optimised for users who prefer CLI.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1C9Ws1dRFgzP0pbdu4yFQz0ScBHapD4AMxx00uMHABoM/edit"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LING..LONG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/JunLongling"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("JunLongling")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/junlongling.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/junlongling.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=junlongling&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3AJunLongling"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("PRAK..INGH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Dinoman44"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Dinoman44")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/dinoman44.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/dinoman44.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=dinoman44&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3ADinoman44"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("RAHU..RWAL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/rahula1008"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rahula1008")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/rahula1008.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/rahula1008.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=rahula1008&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3Arahula1008"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TANG..KIAT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/jktang14"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("jktang14")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/jktang14.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/jktang14.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=jktang14&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3Ajktang14"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TUSH..NWAR")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/tanwartushar"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tanwartushar")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/images/tanwartushar.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-3.github.io/tp/team/tanwartushar.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=tanwartushar&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-3/tp/pulls?q=is%3Apr+author%3Atanwartushar"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14a-4-campusconnect"}},[_v("CS2103T-F14a-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14a-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("CampusConnect]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14a-4-campusconnect","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nuniversity students and staffs\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis app addresses the challenge of building community and collaboration among students and staff by connecting them based on shared modules, clubs, and hobbies. It simplifies the process of finding and accessing contacts for professors and teaching staff, fostering an engaged and supportive academic environment.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1pNdItQwz05w2jIHS-8TAVrb8LetDhRm3EmDsfVCdF34/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHEN..IXUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/CYX22222003"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CYX22222003")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/cyx22222003.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/cyx22222003.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=cyx22222003&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3ACYX22222003"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JUST.. REN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/yooplo"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yooplo")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/yooplo.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/yooplo.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=yooplo&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3Ayooplo"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NGUY..OANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/blackpanther9229"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("blackpanther9229")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/blackpanther9229.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/blackpanther9229.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=blackpanther9229&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3Ablackpanther9229"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..JOHN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/chrisjohntan"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("chrisjohntan")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/chrisjohntan.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/chrisjohntan.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=chrisjohntan&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3Achrisjohntan"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("WONG.. JIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/KrashKart"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("KrashKart")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/images/krashkart.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14a-4.github.io/tp/team/krashkart.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=krashkart&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14a-4/tp/pulls?q=is%3Apr+author%3AKrashKart"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","no-close":"","panelId":"cs2103t-f14b"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h2',{attrs:{"id":"cs2103t-f14b"}},[_v("CS2103T-F14b"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-1-socialbook"}},[_v("CS2103T-F14b-1 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("SocialBook]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-1-socialbook","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nSocial Worker, targeting low-income families with kids\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nOur app aims to streamline the process of social workers contacting and assisting families. It can also help social workers easily prioritise which families need more help, where to get the help, and navigate through families compared to using traditional Excel sheets.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1Os0mVaskpPjVjEzcEIX0iLCnRwVpuPFxLC6tfi6ptEo/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ARJU..ANAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/arjun2598"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("arjun2598")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/arjun2598.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/arjun2598.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=arjun2598&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3Aarjun2598"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LEON.. ZHI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/LeongWZ"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("LeongWZ")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/leongwz.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/leongwz.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=leongwz&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3ALeongWZ"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("NG W..CENT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/nws321"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nws321")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/nws321.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/nws321.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=nws321&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3Anws321"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("OH Y..MENT")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Gra7ityIC3"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gra7ityIC3")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/gra7ityic3.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/gra7ityic3.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gra7ityic3&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3AGra7ityIC3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TERE.. WEN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/TerenceWongsExtravaganza"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TerenceWongsExtravaganza")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/images/terencewongsextravaganza.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-1.github.io/tp/team/terencewongsextravaganza.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=terencewongsextravaganza&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-1/tp/pulls?q=is%3Apr+author%3ATerenceWongsExtravaganza"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-2-tahub-contacts"}},[_v("CS2103T-F14b-2 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-2"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("TAHub Contacts]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-2-tahub-contacts","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nA busy Year 2 CS student, currently a TA of one or more classes, with many commitments who is comfortable with a command line interface, and faces lack of time to keep track of his students' contact details.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nTAHub Contacts is a contact management app that helps them save time by having easy reference to their tutees' contact details, while allowing quick view of other essential data related to the tutee such as grades, participation, GitHub usernames when there is a need to contact them.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1XexU3jPNSLEXA8uvo4p_Knbm5IDvN5Oi-ROUeA_is1Q/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..HANG")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Zeepheru"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Zeepheru")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/zeepheru.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/zeepheru.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zeepheru&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3AZeepheru"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHUA..SUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/FlyingDonkeys"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FlyingDonkeys")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/flyingdonkeys.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/flyingdonkeys.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=flyingdonkeys&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3AFlyingDonkeys"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LATH..IVYA")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/devivy"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("devivy")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/devivy.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/devivy.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=devivy&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3Adevivy"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("MAXI.. JUN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/miloaisdino"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("miloaisdino")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/miloaisdino.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/miloaisdino.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=miloaisdino&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3Amiloaisdino"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("YEOH..G YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/accountexeregister"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("accountexeregister")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/images/accountexeregister.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-2.github.io/tp/team/accountexeregister.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=accountexeregister&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-2/tp/pulls?q=is%3Apr+author%3Aaccountexeregister"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-3-contactmate"}},[_v("CS2103T-F14b-3 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-3"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("ContactMate]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-3-contactmate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEmployees at Active Ageing Centres\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nEasy way to manage regular checkups. Fast, convenient and reliable way to organise contacts and ensure that everyone is checked up on a regular basis. It solves the problem of having to manually manage all the elderly just to keep up with the government’s (AIC) requirements.\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1eWI5Rp1Zy4cRIW3mugGWmQXJVmnidlDuYnLdtZk3wdY/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("BREN..GJIE")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/brendanng7"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("brendanng7")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/brendanng7.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/brendanng7.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=brendanng7&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3Abrendanng7"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("CHAN..RIEL")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/GabrielCWT"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GabrielCWT")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/gabrielcwt.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/gabrielcwt.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=gabrielcwt&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3AGabrielCWT"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LINE.. GOH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/linette-g"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("linette-g")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/linette-g.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/linette-g.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=linette-g&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3Alinette-g"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TAN ..YING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/zyng233"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("zyng233")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/zyng233.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/zyng233.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zyng233&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3Azyng233"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("ZEN .. KOH")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Zenkoh1"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Zenkoh1")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/images/zenkoh1.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-3.github.io/tp/team/zenkoh1.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=zenkoh1&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-3/tp/pulls?q=is%3Apr+author%3AZenkoh1"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"container"},[_c('div',{staticClass:"row"},[_c('div',{staticClass:"col border"},[_c('h3',{attrs:{"id":"cs2103t-f14b-4-financial-assurance-revolutionary-telemarketer"}},[_v("CS2103T-F14b-4 "),_c('small',[_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp"}},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp/pulls?utf8=%E2%9C%93&q=is%3Apr+is%3Aopen+CS2103T-F14b-4"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/issues/new"}},[_c('span',{staticClass:"far fa-comment",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/actions"}},[_c('pic',{attrs:{"eager":"","src":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/workflows/Java%20CI/badge.svg"}})],1),_v(" ["),_c('strong',[_v("Financial Assurance Revolutionary Telemarketer]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cs2103t-f14b-4-financial-assurance-revolutionary-telemarketer","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('img',{attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/Ui.png","width":"750","onerror":"this.src='images/placeholder-large.png';"}})]),_c('p')]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103"}},[_c('strong',[_v("Target user:")]),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nThis product is for financial advisors who specialise mainly in client outreach\n")])]),_v(" "),_c('p',[_c('strong',[_v("Value proposition:")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('blockquote',[_v("\nAllowing agents to easily keep track of who they have and have not contacted recently Sort their clients based on various categories (ie. occupation, SES, location) Automate the process of sending out catch-up messages to clients, automatic reminder to the user if a client has not been contacted in awhile\n")])]),_v(" "),_c('p',[_c('strong',[_v("Project notes")]),_v(" (internal): see "),_c('a',{attrs:{"href":"https://docs.google.com/document/d/1_QzlAbiqcr_58D0zK0Gpm1a4WA3YKoFclGakOURcbbQ/edit?usp=sharing"}},[_v("here")])])]),_c('p')])]),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("AW J..STIN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Justin-Aw46"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Justin-Aw46")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/justin-aw46.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/justin-aw46.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=justin-aw46&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3AJustin-Aw46"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("JOSH..MING")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/AlphaPyke"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("AlphaPyke")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/alphapyke.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/alphapyke.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=alphapyke&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3AAlphaPyke"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("LIM ..O YI")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/meatyturtle"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("meatyturtle")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/meatyturtle.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/meatyturtle.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=meatyturtle&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3Ameatyturtle"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("SHAN.. TAY")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/Shantaa"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Shantaa")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/shantaa.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/shantaa.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=shantaa&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3AShantaa"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('div',{staticClass:"col text-center border"},[_c('p',[_c('strong',[_v("TIEW..XUAN")]),_c('br'),_v(" "),_c('sup',[_c('a',{attrs:{"href":"https://github.com/fymbc"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("fymbc")])])]),_c('br'),_v(" "),_c('img',{staticStyle:{"border-radius":"8px"},attrs:{"src":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/images/fymbc.png","width":"120","onerror":"this.src='images/placeholder-small.png';"}}),_c('br'),_c('a',{attrs:{"href":"https://AY2425S1-CS2103T-F14b-4.github.io/tp/team/fymbc.html"}},[_c('span',{staticClass:"fas fa-file-powerpoint",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://nus-CS2103-AY2425S1.github.io/tp-dashboard/?search=fymbc&breakdown=true"}},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AY2425S1-CS2103T-F14b-4/tp/pulls?q=is%3Apr+author%3Afymbc"}},[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p')])],1),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-teams"}},[_v("tP Teams‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w08"}},[_v("CS2103T-W08‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w09"}},[_v("CS2103T-W09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w10"}},[_v("CS2103T-W10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w11"}},[_v("CS2103T-W11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w12"}},[_v("CS2103T-W12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w13"}},[_v("CS2103T-W13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-w14"}},[_v("CS2103T-W14‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t08"}},[_v("CS2103T-T08‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t09"}},[_v("CS2103T-T09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t10"}},[_v("CS2103T-T10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t11"}},[_v("CS2103T-T11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t12"}},[_v("CS2103T-T12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t13"}},[_v("CS2103T-T13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t14"}},[_v("CS2103T-T14‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t15"}},[_v("CS2103T-T15‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t16"}},[_v("CS2103T-T16‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-t17"}},[_v("CS2103T-T17‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f08"}},[_v("CS2103T-F08‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f09"}},[_v("CS2103T-F09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f09"}},[_v("CS2103-F09‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f10"}},[_v("CS2103T-F10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f10"}},[_v("CS2103-F10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f11"}},[_v("CS2103T-F11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f11"}},[_v("CS2103-F11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f12"}},[_v("CS2103-F12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f12"}},[_v("CS2103T-F12‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f13"}},[_v("CS2103T-F13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103-f13"}},[_v("CS2103-F13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f15"}},[_v("CS2103T-F15‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f14a"}},[_v("CS2103T-F14a‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#cs2103t-f14b"}},[_v("CS2103T-F14b‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(1)])} }; var pageVueStaticRenderFns = [function anonymous( ) { with(this){return _c('h1',{attrs:{"id":"tp-teams"}},[_v("tP Teams"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tp-teams","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/textbooks.html b/admin/textbooks.html index db581b2ee0..fa43a8330f 100644 --- a/admin/textbooks.html +++ b/admin/textbooks.html @@ -21,7 +21,7 @@
  • InstructorsProgramming Language


    Textbooks

    This course is supported by a customized online textbook Software Engineering for Self-Directed Learners (CS2103 edition), integrated into this course website.

    Topics relevant for a week appears under the weekly schedule page (see the Topics tab). Some topics in there come with pre-recorded videos. Watching those videos is encouraged but optional: while they do not have additional theory not already covered by the text version, they can have complementary explanations, more examples, visualizations etc.

    Tips for watching pre-recorded videos
    • You are recommended to watch Videos provided at faster speeds (x1.25 or even x1.5) to save time.
    • You'll need to use your NUSNET login to access them.

    A PDF version of the full textbook will be provided at the start of the semester, via Canvas. In addition, you can use this technique to save the main text of a specific page/chapter as a pdf file.


    InstructorsProgramming Language

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    InstructorsProgramming Language


    Textbooks

    This course is supported by a customized online textbook Software Engineering for Self-Directed Learners (CS2103 edition), integrated into this course website.

    Topics relevant for a week appears under the weekly schedule page (see the Topics tab). Some topics in there come with pre-recorded videos. Watching those videos is encouraged but optional: while they do not have additional theory not already covered by the text version, they can have complementary explanations, more examples, visualizations etc.

    Tips for watching pre-recorded videos
    • You are recommended to watch Videos provided at faster speeds (x1.25 or even x1.5) to save time.
    • You'll need to use your NUSNET login to access them.

    A PDF version of the full textbook will be provided at the start of the semester, via Canvas. In addition, you can use this technique to save the main text of a specific page/chapter as a pdf file.


    InstructorsProgramming Language

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/textbooks.page-vue-render.js b/admin/textbooks.page-vue-render.js index 4aef2f714c..805fe773ba 100644 --- a/admin/textbooks.page-vue-render.js +++ b/admin/textbooks.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('mark',[_c('strong',[_v("A PDF version of the full with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/programmingLanguages.html"}},[_c('span',[_v("Programming Language "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tools.html b/admin/tools.html index 1dae4fb74d..02f1c7d696 100644 --- a/admin/tools.html +++ b/admin/tools.html @@ -26,7 +26,7 @@ Install MST in your computer. Installation and login instructions are here. Remember to login using your NUSNET account.
    • MS Team for this class: CS2103/T-AY2425S1 No need to send 'join requests'. We'll be mass-adding you to this around week 2.

    Tool: IntelliJ IDE

    IntelliJ IDEA is the recommended IDE for course-related programming work. Using an IDE is strongly recommended but is not compulsory.

    Use other IDEs at your own risk, because,
    a) course materials are optimized for IntelliJ, and,
    b) we won't be able to help you if you run into problems while using any other IDE.

    Preparation:

    • Install the IDE in your computer. You may use the IntelliJ community edition (free) or the ultimate edition (free for students).
    • If you have an older version of the IDE, we recommend updating to the latest version.

    Tool: RepoSense (for authorship tracking)

    We will be using a tool called RepoSense to make it easier for you to see (and learn from) code written by others, and to help us see who wrote which part of the code.

    RepoSense report screenshot Figure: RepoSense Report Features

    Viewing the current status of code authorship data:

    • The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the Code Panel (shown on the right side of the screenshot above). It shows the code attributed to a given author.
    • Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.
    • If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.

    If the code does not match the actual authorship: Given below are the possible reasons for the code shown to mismatch the code you wrote.

    • Reason 1: the Author name of some of your commits is not known to RepoSense -- this is a result of not setting the git.username property as instructed in our Git setup instructions.
      How to check: Find the Author name of your commits that are missing (you can use Sourcetree or the git log command for that -- it's not possible to do that using the GitHub interface though).
      Check if that author name is included in the RepoSense config for the iP or the RepoSense config for the tP (whichever the applicable one)
      Remedy: Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.

    • Reason 2: The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead.
      Remedy: You can add @@author annotations as explained in the panel below:

    Adding @@author tags to indicate authorship


    • Reason 3: Some commits should not be included in the authorship analysis e.g., you committed the code of a third party library by mistake.
      Remedy: Let us know the hashes of the commits that need to be omitted from the analysis.

    If none of the above works, please please post in the forum or contact us via cs2103@comp.nus.edu.sg so that we can advise you what to do.

    We recommend you ensure your code is RepoSense-compatible by v1.5

    Tool: TEAMMATES (for Peer Evaluations)

    We use the TEAMMATES online peer evaluation system. TEAMMATES is a project run by NUS SoC students and used by over a million users from over 1500 universities.

    Preparation: -When the first feedback session is open on TEAMMATES, you will receive an email from TEAMMATES. There is nothing for you to do until then.

    When you do receive that email, it will contain a unique link that you can use to access TEAMMATES without logging in first. Logging in to TEAMMATES using a Google account is optional (but doing so will allow you to see all your TEAMMATES sessions in one page).


    Peer EvaluationsExams

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +When the first feedback session is open on TEAMMATES, you will receive an email from TEAMMATES. There is nothing for you to do until then.

    When you do receive that email, it will contain a unique link that you can use to access TEAMMATES without logging in first. Logging in to TEAMMATES using a Google account is optional (but doing so will allow you to see all your TEAMMATES sessions in one page).


    Peer EvaluationsExams

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tools.page-vue-render.js b/admin/tools.page-vue-render.js index 2b815e87f5..477b789469 100644 --- a/admin/tools.page-vue-render.js +++ b/admin/tools.page-vue-render.js @@ -95,6 +95,6 @@ with(this){return _c('p',[_v("We use the "),_c('a',{attrs:{"href":"http://teamma with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/peerEvaluations.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Peer Evaluations")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/exams.html"}},[_c('span',[_v("Exams "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-common-fragments.html b/admin/tp-common-fragments.html index ba489aacd9..fd1fe3ef77 100644 --- a/admin/tp-common-fragments.html +++ b/admin/tp-common-fragments.html @@ -13,7 +13,7 @@

    COMMON MISTAKE: Not following the required phrasing style for the first sentence of Java method header comments.

    COMMON MISTAKE: Not following the convention for Git commit message subject.
    -Caution: This is very hard to rectify later, after the PR containing the commits have been merged. Reason: While Git allows editing past commits, doing so changes their timestamp, which affects your weekly code contribution stats (which are factored into evaluating the consistency of your coding work over the project duration).

    COMMON MISTAKE: Forgetting to do each PR from a separate branch (i.e., send PR from the master branch) of your fork. This error means your PR will not be considered as following the forking workflow correctly.

    COMMON MISTAKE: Not giving enough PR review comments. Remember to do proper PR reviews throughout the tP, at least for non-trivial changes, as the quality and quantity of PR review comments you have given to peers affect your tP marks (under the project management aspect).

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Caution: This is very hard to rectify later, after the PR containing the commits have been merged. Reason: While Git allows editing past commits, doing so changes their timestamp, which affects your weekly code contribution stats (which are factored into evaluating the consistency of your coding work over the project duration).

    COMMON MISTAKE: Forgetting to do each PR from a separate branch (i.e., send PR from the master branch) of your fork. This error means your PR will not be considered as following the forking workflow correctly.

    COMMON MISTAKE: Not giving enough PR review comments. Remember to do proper PR reviews throughout the tP, at least for non-trivial changes, as the quality and quantity of PR review comments you have given to peers affect your tP marks (under the project management aspect).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-common-fragments.page-vue-render.js b/admin/tp-common-fragments.page-vue-render.js index cc36990c6a..f55707ca85 100644 --- a/admin/tp-common-fragments.page-vue-render.js +++ b/admin/tp-common-fragments.page-vue-render.js @@ -5,6 +5,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" }; var pageVueStaticRenderFns = [function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-constraints.html b/admin/tp-constraints.html index 4d28b17efe..ccb8f27023 100644 --- a/admin/tp-constraints.html +++ b/admin/tp-constraints.html @@ -30,7 +30,7 @@ Some suggestions:

    • Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).
    • Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.
    • Using JavaFX WebView allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.

    Constraint-PDF-Friendly

    The DG and UG should be PDF-friendly. Don't use expandable panels, embedded videos, animated GIFs etc.

    Reason: The UG and DG used in the final grading will be in PDF format


    In addition, you are strongly encouraged to follow these recommendations as they can help increase your project score.

    Recommendation-Minimal-Network

    It is OK to use a reliable public API e.g., Google search but we recommend that you have a fallback mechanism (e.g., able to load data using a data file if the network is down).
    Reason: During the mass peer-testing session, the network access can be intermittent due to high load. If your feature cannot be tested due to lack of Internet, that will have to be counted as a major bug, to be fair to those whose app is being tested and bugs found being penalized.
    If you use NUS data (e.g., scrape data from an NUS website), please work with NUS IT directly to get their approval first. Even well-intentioned use of NUS data without approval can get you into serious trouble (has happened before). The teaching team will not be able to get approval for you as the use of NUS data is not a course requirement.

    Recommendation-Testability

    Avoid implementing hard-to-test (both for manual testing as well as automated testing) features or features that make your product hard-to-test.
    Reason: testability is a grading criterion. If you choose to implement such a feature, you will need to spend an extra effort to reach an acceptable level of testability. Here are some examples of features that are hard-to-test:

    • Features that depend heavily on remote APIs: Those APIs can block your access if they mistake your automated tests as a bot attack. Some remote APIs require setting up accounts, keys, login etc, that will irritate the testers of your product and give a low rating to the testability of your work.
    • Audio-related features: The peer testing of your product is done under exam conditions where it is not appropriate to play audio.
    • Features that require creating user accounts, login, logout etc.

    Recommendation-CLI-First

    Following from the Constraint-Typing-Preferred, if the app is optimized for the target user (graded under the product design criterion), a user who can type fast should be able to accomplish most tasks faster via a command line interface (CLI), compared to a hypothetical GUI-only version of the app. For example, adding a new entity via the CLI should be faster than entering the same data through a GUI form.
    Therefore, the input to the app needs to be primarily CLI. The GUI is used primarily to give visual feedback to the user. This does not mean the app need to have a text UI (CLI is not the same as text UI) or it needs to work in a command console -- it simply means the input to the app should be a text command, which can even be entered using a GUI (similar to how AB3 does it). While we don't prohibit non-CLI inputs (e.g., clicking of a button), note that such inputs will reduce the suitability of the product to target users. Therefore, give CLI alternatives to mouse/GUI inputs, if applicable.
    -Also keep in mind:

    • Regular typing is usually faster than using key combinations.
    • are faster over . If you provide a multi-step command to help new users, it is recommended that you also provide a one-shot equivalent for regular/expert users.

    Recommendation-Realistic

    Keeping the target usage of the application 'realistic' can be helpful when making product design decisions later. For example, a patient tracking app for a big hospital is not realistic usage scenario because a big hospital is unlikely to use a small standalone desktop application for that purpose. However, it is more realistic for an independent home-based healthcare worker (e.g., a physical therapist) to use such an app to keep track of his/her patients.

    If you are not sure if your product complies with a certain constraint/recommendation, please seek clarification by posting in the forum (preferred) or email prof.


    tP: TimelinetP: Forming Teams

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Also keep in mind:

    • Regular typing is usually faster than using key combinations.
    • are faster over . If you provide a multi-step command to help new users, it is recommended that you also provide a one-shot equivalent for regular/expert users.

    Recommendation-Realistic

    Keeping the target usage of the application 'realistic' can be helpful when making product design decisions later. For example, a patient tracking app for a big hospital is not realistic usage scenario because a big hospital is unlikely to use a small standalone desktop application for that purpose. However, it is more realistic for an independent home-based healthcare worker (e.g., a physical therapist) to use such an app to keep track of his/her patients.

    If you are not sure if your product complies with a certain constraint/recommendation, please seek clarification by posting in the forum (preferred) or email prof.


    tP: TimelinetP: Forming Teams

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-constraints.page-vue-render.js b/admin/tp-constraints.page-vue-render.js index 5e538b7b21..7b32a5648b 100644 --- a/admin/tp-constraints.page-vue-render.js +++ b/admin/tp-constraints.page-vue-render.js @@ -89,6 +89,6 @@ with(this){return _c('div',{attrs:{"id":"Recommendation-Realistic"}},[_c('h4',{a with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Timeline")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-teams.html"}},[_c('span',[_v("tP: Forming Teams "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-deliverables.html b/admin/tp-deliverables.html index 4c639b486e..1087717e9f 100644 --- a/admin/tp-deliverables.html +++ b/admin/tp-deliverables.html @@ -88,7 +88,7 @@ -
    • There is no need to introduce team members or explain who did what. Reason: to save time.
    • Present the features in a reasonable order: Organize the demo to present a cohesive picture of the product as a whole, presented in a logical order.
    • No need to cover design/implementation details as the manager is not interested in those details.

    Demo Structure

    • Demo the product using the same executable you submitted
    • Use a sufficient amount of demo data. e.g at least 20 data items. Trying to demo a product using just 1-2 sample data creates a bad impression.

    Demo Tips

    • Plan the demo to be in sync with the impression you want to create. For example, if you are trying to convince that the product is easy to use, show the easiest way to perform a task before you show the full command with all the bells and whistles.


    tP Week 13: Public release → v1.6tP: Practical Exam Dry Run

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • There is no need to introduce team members or explain who did what. Reason: to save time.
    • Present the features in a reasonable order: Organize the demo to present a cohesive picture of the product as a whole, presented in a logical order.
    • No need to cover design/implementation details as the manager is not interested in those details.

    Demo Structure

    • Demo the product using the same executable you submitted
    • Use a sufficient amount of demo data. e.g at least 20 data items. Trying to demo a product using just 1-2 sample data creates a bad impression.

    Demo Tips

    • Plan the demo to be in sync with the impression you want to create. For example, if you are trying to convince that the product is easy to use, show the easiest way to perform a task before you show the full command with all the bells and whistles.


    tP Week 13: Public release → v1.6tP: Practical Exam Dry Run

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-deliverables.page-vue-render.js b/admin/tp-deliverables.page-vue-render.js index 00f3f5e2fc..0705b57d42 100644 --- a/admin/tp-deliverables.page-vue-render.js +++ b/admin/tp-deliverables.page-vue-render.js @@ -152,6 +152,6 @@ with(this){return _c('p',[_c('mark',[_c('strong',[_v("To reduce workload, this d with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w13.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 13: Public release → v1.6")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-ped.html"}},[_c('span',[_v("tP: Practical Exam Dry Run "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-expectations.html b/admin/tp-expectations.html index 8805a68fdc..3802271b10 100644 --- a/admin/tp-expectations.html +++ b/admin/tp-expectations.html @@ -31,7 +31,7 @@ (c) Hard to keep tests passing i.e., tests break when one component is updated without the others
    (e) Integration become harder/riskier i.e., move from continuous integration (safer) towards big-bang integration (riskier)
    (f) Not aligned with breadth-first iterative i.e. evolving components separately moves you towards depth-first iterative approach instead

    • Recommended: Divide the components of the product among team members. Notwithstanding the above, you are still recommended to divide the components of the product among team members so that each team member is in charge of one or more components. While others will be modifying those components to fit their features, your role as the in charge of a component is to guide others modifying that component (reason: you are supposed to be the most knowledgeable about that component) and protect that component from degrading e.g., you can review others' changes to your component and suggest possible changes.

    Individual Expectations on Documentation

    • Objective: showcase your ability to write both user-facing documentation and developer-facing documentation.
    • Expectation Update the User Guide (UG) and the Developer Guide (DG) parts that are related to the enhancements you added.
    • Optional: If the UG/DG updates for your enhancements are not enough to reach the above requirements, you can make up the shortfall by documenting 'proposed' features and alternative designs/implementations.

    Individual Expectations on Testing

    • Expectation Write some automated tests so that there is evidence that you can write automated tests.

    🤔 How much testing is enough? We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required.
    -There is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.

    Individual Expectations on Teamwork

    • Expectation Do a non-trivial share of the team-tasks.

    Team-tasks are the tasks that someone in the team has to do.

    Examples of team-tasks


    • Expectation Carry a non-trivial share of project roles and responsibilities.

    Roles indicate aspects you are in charge of and responsible for. E.g., if you are in charge of documentation, you are the person who should allocate which parts of the documentation is to be done by whom, ensure the document is in right format, ensure consistency etc.

    Example roles and responsibilities


    Ensure each of the important roles are assigned to one person in the team. It is OK to have a 'backup' for each role, but for each aspect there should be one person who is unequivocally the person responsible for it. Reason: when everyone is responsible for everything, no one is.

    • Expectation Review each others work. Reason: reviewing skills is a learning outcome, and it is mutually beneficial.

    tP (team project): OverviewtP: Timeline

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +There is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.

    Individual Expectations on Teamwork

    • Expectation Do a non-trivial share of the team-tasks.

    Team-tasks are the tasks that someone in the team has to do.

    Examples of team-tasks


    • Expectation Carry a non-trivial share of project roles and responsibilities.

    Roles indicate aspects you are in charge of and responsible for. E.g., if you are in charge of documentation, you are the person who should allocate which parts of the documentation is to be done by whom, ensure the document is in right format, ensure consistency etc.

    Example roles and responsibilities


    Ensure each of the important roles are assigned to one person in the team. It is OK to have a 'backup' for each role, but for each aspect there should be one person who is unequivocally the person responsible for it. Reason: when everyone is responsible for everything, no one is.

    • Expectation Review each others work. Reason: reviewing skills is a learning outcome, and it is mutually beneficial.

    tP (team project): OverviewtP: Timeline

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-expectations.page-vue-render.js b/admin/tp-expectations.page-vue-render.js index 4e7160c15b..e1e77d1e74 100644 --- a/admin/tp-expectations.page-vue-render.js +++ b/admin/tp-expectations.page-vue-render.js @@ -68,6 +68,6 @@ with(this){return _c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v( with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP (team project): Overview")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('span',[_v("tP: Timeline "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-grading.html b/admin/tp-grading.html index 7fe697288e..3096f54234 100644 --- a/admin/tp-grading.html +++ b/admin/tp-grading.html @@ -34,7 +34,7 @@

    Problems in Use Cases. Examples:

    • Important use cases missing (a use case is important if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)
    • Formatting/notational errors
    • Incorrect step numbering
    • Unnecessary UI details mentioned
    • Missing/unnecessary steps
    • Missing extensions

    Problems in NFRs. Examples:

    • Not really a Non-Functional Requirement
    • Not scoped clearly (i.e., hard to decide when it has been met)
    • Not reasonably achievable
    • Highly relevant NFRs missing

    Problems in Glossary. Examples:

    • Unnecessary terms included
    • Important terms missing -

    5. Project Grading: Project Management [ 5 + 5 = 10 marks]

    5A. Process:

    Evaluates: How well you did in project management related aspects of the project, as an individual and as a team

    Based on: tutor/grading-script observations of project milestones and GitHub data

    Grading criteria:

    • Project done iteratively and incrementally (opposite: doing most of the work in one big burst)

    • Project tasks done on time (to get a good grade for this aspect, finish at least 75% of the tasks by the deadline).

    • Good use of these GitHub mechanisms:

      • milestones
      • releases
      • issue tracker (with good task definition, assignment, and tracking)
      • PRs, and PR reviews
    • Good version control, based on the repo.

    • Reasonable attempt to use the prescribed workflows.

    • Good use of buffers (opposite: everything at the last minute).

    5B. Team-tasks:

    Evaluates: How much you contributed to team-tasks

    Based on: peer evaluations, tutor observations

    Grading criteria: Do the following to get a good grade for this aspect:

    • Do close to an equal share of the team tasks.
    • Have commits in four of weeks 7, 8, 9, 10, 11, 12

    tP: Practical ExamtP: Supervision/Guidance

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    5. Project Grading: Project Management [ 5 + 5 = 10 marks]

    5A. Process:

    Evaluates: How well you did in project management related aspects of the project, as an individual and as a team

    Based on: tutor/grading-script observations of project milestones and GitHub data

    Grading criteria:

    • Project done iteratively and incrementally (opposite: doing most of the work in one big burst)

    • Project tasks done on time (to get a good grade for this aspect, finish at least 75% of the tasks by the deadline).

    • Good use of these GitHub mechanisms:

      • milestones
      • releases
      • issue tracker (with good task definition, assignment, and tracking)
      • PRs, and PR reviews
    • Good version control, based on the repo.

    • Reasonable attempt to use the prescribed workflows.

    • Good use of buffers (opposite: everything at the last minute).

    5B. Team-tasks:

    Evaluates: How much you contributed to team-tasks

    Based on: peer evaluations, tutor observations

    Grading criteria: Do the following to get a good grade for this aspect:

    • Do close to an equal share of the team tasks.
    • Have commits in four of weeks 7, 8, 9, 10, 11, 12

    tP: Practical ExamtP: Supervision/Guidance

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-grading.page-vue-render.js b/admin/tp-grading.page-vue-render.js index d306fb6730..b194624d2f 100644 --- a/admin/tp-grading.page-vue-render.js +++ b/admin/tp-grading.page-vue-render.js @@ -128,6 +128,6 @@ with(this){return _c('ul',[_c('li',[_v("Do close to an equal share of the team t with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-pe.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Practical Exam")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('span',[_v("tP: Supervision/Guidance "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-overview.html b/admin/tp-overview.html index 3518ca7c56..f685f6ffe5 100644 --- a/admin/tp-overview.html +++ b/admin/tp-overview.html @@ -27,7 +27,7 @@
    • make the commands more natural, easier to type/remember, allow aliases, etc.
    • make the search feature more powerful (e.g, fuzzy search)
    • tweak the GUI to be more useful (e.g., highlight the contact added/edited
    • provide GUI alternatives to CLI commands where appropriate)
  • Add more general features e.g.,
    • import/export data from other formats
    • archive old data
    • more help: guided tours, tool tips, tip of the day etc.
    • stats, analytics, visualizations
    • undo/redo
    • result preview (i.e., show what would happen if the current command is executed)
  • Internal improvements e.g., refactor the current design/implementation to make it better in some way
  • pros: less changes to existing code at the start of the project (i.e., progress will be smoother at the start), can result in a more mature product with deeper features as the product functionality will be moving forward from the start.

    cons: less flexibility in product design.

    Direction 2: Morph Morph AB3 in any direction you wish.

    This direction is not available this semester, as it has been observed to increase tP workload beyond what students anticipate when making this choice (e.g., 40-50% more work than strictly needed by the tP). Besides, it is less brownfield than direction 1.

    pros: more flexibility in the project direction.

    cons: more changes to the existing code at the start while you are still not very familiar with the codebase, morphing is less common in real projects (compared to direction 1).

    Note that creating a novel/unique/interesting product will NOT earn you extra marks in this course. While those qualities are important in real world projects, and we do allow you room to go in those directions in this course, they are not the focus of this course (there are other courses such as CS3216, CS3217 that focus on those aspects). Focus your energy on creating a solid product at a high quality level, which actually take a lot more energy than you might realize at first. Go for novelty/uniqueness/interesting etc. only if you have energy to spare and can do so without compromising the quality. For example, a bland feature/product implemented well will score more marks than a novel product that is buggy, even if the novel features were harder to implement.

    Target User & Value Proposition

    You are expected to:

    • Define a very specific target user profile.
      We require you to narrow down the target user profile as opposed to trying to make it as general as possible. Here is an example of progressively narrowing down target user: anybody → teachers → university teachers → tech-savvy university teachers → instructors of course CS____.

      Be careful not to contradict given project constraints when defining the user profile e.g. the target user should still prefer typing to mouse actions.

    FAQ Why the need to narrow down the user profile?


    FAQ How narrow can we make the target market?


    • Define a clear value proposition that matches the target user profile i.e., what problem does the product solve? how does it make the user's life easier?
      You should also define the scope clearly i.e., boundary beyond which the app will not help e.g., the app will manage contact details of a small number of JC-level students (which means the there is no support for managing large number of students or primary/adult students, and will only manage contact details -- not other details such as grades).
    • Aim to optimize the product to the chosen target users Although you should not decide specific features yet, keep in mind that eventually you should optimize the product for the chosen target user i.e., add/tweak features that are especially/only applicable for target users (to make the app especially attractive to them). -
      • Example 1: If the product targets CS2103/T instructors, there can be features that are applicable to them only, such as the ability to see a link to a student's project on GitHub

      • Example 2: If your app manages contacts, you can optimize its features based on,

        • the profession of the target user e.g. doctors, salesmen, teachers, etc.
        • the nature/scale of contacts e.g. huge number of contacts (for HR admins, user group admins), mostly incomplete contacts, highly volatile contact details, contacts become inactive after a specific period (e.g. contract employees)
        • what users do with the contacts e.g. organize group events, share info, do business, do analytics

        Your project will be graded based on how well the features match the target user profile and how well the features fit-together.


    iP: GradingtP: Expectations

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Example 1: If the product targets CS2103/T instructors, there can be features that are applicable to them only, such as the ability to see a link to a student's project on GitHub

    • Example 2: If your app manages contacts, you can optimize its features based on,

      • the profession of the target user e.g. doctors, salesmen, teachers, etc.
      • the nature/scale of contacts e.g. huge number of contacts (for HR admins, user group admins), mostly incomplete contacts, highly volatile contact details, contacts become inactive after a specific period (e.g. contract employees)
      • what users do with the contacts e.g. organize group events, share info, do business, do analytics

      Your project will be graded based on how well the features match the target user profile and how well the features fit-together.


    iP: GradingtP: Expectations

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-overview.page-vue-render.js b/admin/tp-overview.page-vue-render.js index b851b7a3c3..9c4db0a906 100644 --- a/admin/tp-overview.page-vue-render.js +++ b/admin/tp-overview.page-vue-render.js @@ -62,6 +62,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Define a clear "),_c('em',[ with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/ip-grading.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" iP: Grading")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('span',[_v("tP: Expectations "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-pe.html b/admin/tp-pe.html index f0475a2e43..e599bc8347 100644 --- a/admin/tp-pe.html +++ b/admin/tp-pe.html @@ -100,7 +100,7 @@
    • If it is not easy to decide the assignee(s), we recommend (but not enforce) that the feature owner should be assigned bugs related to the feature, Reason: The feature owner should have defended the feature against bugs using automated tests and defensive coding techniques.
    • It is also fine to not assign a bug to anyone, in which case the penalty will be divided equally among team members.

    • As far as possible, choose the correct type.*, severity.*, response.*, assignees, and duplicate status even for bugs you are not accepting. Reason: your non-acceptance may be rejected in a later phase, in which case we need to grade it as an accepted bug.
      If a bug's 'duplicate' status was rejected later (i.e., the tester says it is not really a duplicate and the teaching team agrees with the tester), it will inherit the response/type/severity/assignees from the 'original' bug that it was claimed to be a duplicate of.

    • Justify your response. For all the following cases, you must add a comment justifying your stance. Testers will get to respond to all those cases and will be considered by the teaching team in later phases (when resolving disputed bug reports).
      If you don't provide a justification and the tester disagrees with your decision, the teaching team will have no choice but to rule in favor of the tester.

      • downgrading severity
      • non-acceptance of a bug
      • changing the bug type
      • non-obvious duplicate

    FAQ: Do we need to justify even if we accept the bug as is?


    FAQ: So, those who write more code will be hit with more bugs? How's that fair?


    FAQ: What if the bug is real but the tester used the wrong label (e.g., used the wrong type.*). Can we reject that bug?


    FAQ: What if the bug the tester reported is legit but the expected behavior tester suggested is not correct?


    • You can also refer to the below guidelines:


    PE Phase 3: Tester Response

    In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE

    Start: Within 1 day after Phase 2 ends.

    While you are waiting for Phase 3 to start, comments will be added to the bug reports in your /pe repo, to indicate the response each received from the receiving team. Please do not edit any of those comments or reply to them via the GitHub interface. Doing so can invalidate them, in which case the grading script will assume that you agree with the dev team's response. Instead, wait till the start of the Phase 3 is announced, after which you should use CATcher to respond.

    Deadline: Thu, Nov 21st 2359

    • In this phase you will get to state whether you agree or disagree with the dev team's response to the bugs you reported. If a bug reported has been subjected to any of the below by the dev team, you can record your objections and the reason for the objection.
      • not accepted
      • severity downgraded
      • bug type changed
      • bug flagged as duplicate (Note that you still get credit for bugs flagged as duplicates, unless you reported both bugs yourself. Nevertheless, it is in your interest to object to incorrect duplicate flags because when a bug is reported by more testers, it will be considered an 'obvious' bug and will earn slightly less credit than otherwise)

    Don't feel upset if the dev team did not totally agree with most of the bugs you reported. That is to be expected, given you had very short time to make those bug decisions while the dev team had a lot more time to deliberate about them. Some may have given unreasonable (in your opinion) arguments against your bug reports; not to worry, just give your counter-arguments and leave it to the teaching team to decide (in the next phase) which position is more reasonable.

    However, if the dev team's argument is not too far from 'reasonable', it may be better to agree than disagree.
    Reason: an incorrect counterargument at this phase will lower your accuracy more than an incorrect decision made during the testing phase (because you now have more time to think about the bug) i.e., changing your position after you had more time to think of it and after having seen more information is encouraged, compared to sticking to your initial position 'no matter what'.

    • If you would like to revise your own initial type/severity in response to the team's inputs, you can state that in your explanation e.g., you rated the bug severity.High and the team changed it to severity.Low but now you think it should be severity.Medium (do not change the original labels yourself though).
    • You can also refer to the below guidelines, mentioned during the previous phase as well:

    • If the dev team disagreed with an aspect (i.e., type/severity/) and you now agree with the dev team's position, it will not hurt your accuracy rating. Here are some examples (for the severity.*):
    Tester choice Dev choice Tester reaction Teacher decision Dev accuracy Tester accuracy
    High agreed
    High Low agreed no effect
    High Low disagreed High
    High Low disagreed Low
    • If you do not respond to a dev response, we'll assume that you agree with it.
    • Procedure:
    • When the phase has been announced as open, login to CATcher as usual (profile: CS2103/T PE).
    • For each issue listed in the Issues Pending Responses section: -
      • Click on it to go to the details, and read the dev team's response.
      • If you disagree with any of the items listed, tick on the I disagree tick box and enter your justification for the disagreement, and click Save.
      • If you are fine with the team's changes, click Save without any other changes upon which the issue will move to the Issue Responded section.
    • No action is required for the bugs the team accepted exactly as you reported them (i.e., no change to type or severity). They are shown in CATcher for your reference only.

    You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.


    FAQ: What if the team rejected my bug report without giving a reason?


    FAQ: Can I add more information about the bug when I object to a dev team's response?



    PE Phase 4: Tutor Moderation

    In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.

    tP: Practical Exam Dry RuntP: Grading

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Click on it to go to the details, and read the dev team's response.
    • If you disagree with any of the items listed, tick on the I disagree tick box and enter your justification for the disagreement, and click Save.
    • If you are fine with the team's changes, click Save without any other changes upon which the issue will move to the Issue Responded section.
  • No action is required for the bugs the team accepted exactly as you reported them (i.e., no change to type or severity). They are shown in CATcher for your reference only.

  • You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.


    FAQ: What if the team rejected my bug report without giving a reason?


    FAQ: Can I add more information about the bug when I object to a dev team's response?



    PE Phase 4: Tutor Moderation

    In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.

    tP: Practical Exam Dry RuntP: Grading

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-pe.page-vue-render.js b/admin/tp-pe.page-vue-render.js index 4746c784aa..b90b132896 100644 --- a/admin/tp-pe.page-vue-render.js +++ b/admin/tp-pe.page-vue-render.js @@ -125,6 +125,6 @@ with(this){return _c('h4',{attrs:{"id":"pe-phase-4-tutor-moderation"}},[_c('span with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-ped.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Practical Exam Dry Run")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-grading.html"}},[_c('span',[_v("tP: Grading "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-ped.html b/admin/tp-ped.html index 9660c23f14..65ec5146d9 100644 --- a/admin/tp-ped.html +++ b/admin/tp-ped.html @@ -47,7 +47,7 @@
    • Do not argue with the tester to try to convince that person that your way is correct/better. If at all, you can gently explain the rationale for the current behavior but do not waste time getting involved in long arguments. If you think the suggestion/bug is unreasonable, just thank the tester for their view and discontinue to discussion.
  • Aim to do a systematic triaging of issues received. Some suggestions:
    • Close duplicate issues.
    • Use labels (create new labels if necessary) to,
      • differentiate bugs from the rest (e.g., feature suggestions/flaws).
      • indicate priority of the bugs that need fixing.
    • Assign each bug to the person who should fix it.
  • You may ignore type/severity.* labels given by the tester. They will not affect you or the tester either way -- they were there just for the testers to practice. You may apply your own type/severity labels if you wish.
    In particular, beware of simply following the type.* given by the tester; it is your job to decide the correct type of the issue. e.g., What the tester labeled as a bug might actually be a feature flaw.
  • If a bug report is simply a feature suggestion, you can take note of it and close it (to reduce clutter in the issue tracker, and to make it easy for the teaching team to track your progress on dealing with PE-D issues). Similarly, you can close PE-D issues not relevant to v1.6.
  • Note that listing bugs as 'known bugs' in the UG or specifying unreasonable constraints in the UG to make bugs 'out of scope' will not exempt those bugs from the final grading. That is, PE testers can still earn credit for reporting those bugs and you will still be penalized for them.
    -However, a product is allowed to have 'known limitations' (e.g., a daily expense tracking application meant for students is unable to handle expenses larger than $999) as long as they don't degrade the product's use within the intended scope. They will not be penalized.

    Even bugs inherited from AB3 need to be fixed. As mentioned in a previous week, even bugs you inherited from AB3 need fixing (because "we inherited it from the previous dev team" is not a valid excuse to leave a bug unfixed). If you are unsure if something is such a bug that need fixing, please post in the forum.

    Identify bugs you missed in the PE-D: Visit the issue tracker of the team you tested and see bugs reported by others who tested the same product. Identify bugs you missed (if any). That knowledge might help you find similar bugs in your own product as well as find more bugs during the PE.


    tP: DeliverablestP: Practical Exam

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +However, a product is allowed to have 'known limitations' (e.g., a daily expense tracking application meant for students is unable to handle expenses larger than $999) as long as they don't degrade the product's use within the intended scope. They will not be penalized.

    Even bugs inherited from AB3 need to be fixed. As mentioned in a previous week, even bugs you inherited from AB3 need fixing (because "we inherited it from the previous dev team" is not a valid excuse to leave a bug unfixed). If you are unsure if something is such a bug that need fixing, please post in the forum.

    Identify bugs you missed in the PE-D: Visit the issue tracker of the team you tested and see bugs reported by others who tested the same product. Identify bugs you missed (if any). That knowledge might help you find similar bugs in your own product as well as find more bugs during the PE.


    tP: DeliverablestP: Practical Exam

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-ped.page-vue-render.js b/admin/tp-ped.page-vue-render.js index 0e1c3e4206..8a6f2571f6 100644 --- a/admin/tp-ped.page-vue-render.js +++ b/admin/tp-ped.page-vue-render.js @@ -77,6 +77,6 @@ with(this){return _c('li',[_c('strong',[_v("If a bug report is simply a feature with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Deliverables")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-pe.html"}},[_c('span',[_v("tP: Practical Exam "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-supervision.html b/admin/tp-supervision.html index a00eef6174..7009bd7fbd 100644 --- a/admin/tp-supervision.html +++ b/admin/tp-supervision.html @@ -21,7 +21,7 @@
  • tP: GradingPeer Evaluations


    tP: Supervision/Guidance

    Your tutor will serve as your project supervisor too.

    The tutor's main job (in the context of this course project) is to observe, facilitate self/peer learning, and evaluate. They will not be telling you how to do the project (such guidance is given in other ways e.g., via the course website), or lead/manage the project for you. So, you are expected to self-manage the project. However, if you are facing difficulties, you are welcome/encouraged to keep the tutor informed, so that s/he can take necessary actions.

    Tutors are not allowed to contribute to graded components of your project work. For example, if you are faced with a design decision in your project, a tutor will not make that decision for you. See the panel below for more details.

    How to make project decisions (given instructors are not going to make them for you)? Here are some tips:

    • Quickly try out the alternatives. Rather than get into a analysis-paralysis state, quickly prototype the alternatives to figure out which works better.
    • Go with the team consensus/majority. As most project components are graded by peers, the majority view within the team is a good approximation of how the result will be judged.
    • Go with the simpler alternative that's good enough for the current iteration. That way, if the decision was the wrong one, you'll find out sooner and the cost will be less. A common rookie pitfall is the temptation to look for an ideal future-proof solution -- usually, there is no such thing. Most alternatives can get the job done, it's just that costs and benefits vary.
    • Look at what other teams are doing. That will help you detect if you are going in the wrong direction entirely, and also might lead you to more alternatives to consider.
    • Keep an eye on the results: e.g., Did the design alternative you chose make the code more complex, harder to test, easier to break, harder to modify etc. This will help you decide if you made the right choice.
    • If you realized you picked the wrong alternative, change if you can. Often, the choice you picked may still be good enough to survive the project. In that case, leave it be, but make a mental note about it (you can even document it in the Developer Guide) for future reference -- that's how you build up experience.

    tP: GradingPeer Evaluations

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    tP: GradingPeer Evaluations


    tP: Supervision/Guidance

    Your tutor will serve as your project supervisor too.

    The tutor's main job (in the context of this course project) is to observe, facilitate self/peer learning, and evaluate. They will not be telling you how to do the project (such guidance is given in other ways e.g., via the course website), or lead/manage the project for you. So, you are expected to self-manage the project. However, if you are facing difficulties, you are welcome/encouraged to keep the tutor informed, so that s/he can take necessary actions.

    Tutors are not allowed to contribute to graded components of your project work. For example, if you are faced with a design decision in your project, a tutor will not make that decision for you. See the panel below for more details.

    How to make project decisions (given instructors are not going to make them for you)? Here are some tips:

    • Quickly try out the alternatives. Rather than get into a analysis-paralysis state, quickly prototype the alternatives to figure out which works better.
    • Go with the team consensus/majority. As most project components are graded by peers, the majority view within the team is a good approximation of how the result will be judged.
    • Go with the simpler alternative that's good enough for the current iteration. That way, if the decision was the wrong one, you'll find out sooner and the cost will be less. A common rookie pitfall is the temptation to look for an ideal future-proof solution -- usually, there is no such thing. Most alternatives can get the job done, it's just that costs and benefits vary.
    • Look at what other teams are doing. That will help you detect if you are going in the wrong direction entirely, and also might lead you to more alternatives to consider.
    • Keep an eye on the results: e.g., Did the design alternative you chose make the code more complex, harder to test, easier to break, harder to modify etc. This will help you decide if you made the right choice.
    • If you realized you picked the wrong alternative, change if you can. Often, the choice you picked may still be good enough to survive the project. In that case, leave it be, but make a mental note about it (you can even document it in the Developer Guide) for future reference -- that's how you build up experience.

    tP: GradingPeer Evaluations

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-supervision.page-vue-render.js b/admin/tp-supervision.page-vue-render.js index 5726def993..9550ef6362 100644 --- a/admin/tp-supervision.page-vue-render.js +++ b/admin/tp-supervision.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_c('mark',[_v("Tutors are not allowed to with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-grading.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Grading")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/peerEvaluations.html"}},[_c('span',[_v("Peer Evaluations "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-teams.html b/admin/tp-teams.html index 81f1319259..d8f1dc62ed 100644 --- a/admin/tp-teams.html +++ b/admin/tp-teams.html @@ -24,7 +24,7 @@

    tP: ConstraintstP Week 3: Kickoff


    tP: Forming Teams


    [Picture: The team that was at the top of early Google]

    When to form teams

    • CS2103T: Your team will be formed by the CS2101 side.
    • CS2103: Team forming will be done at the start of the week 3 tutorial. If you are not there at the team forming time and others in the class are unaware which team you wanted to be in, we'll have to put you into a team randomly.

    Team size

    • The default team size is five.

    Team composition

    • We allow some freedom in choosing team members, subject to these constraints:
      • All team members should be in the same tutorial. Delay forming teams until your place in a tutorial is confirmed. We do not allow changing tutorials to team up with your preferred team mates.
      • Teams of a single nationality are not allowed unless the only language common among all team members is English. e.g. an all-Singaporean team that include both Chinese and Malay students. Rationale: to train you to work in multicultural teams, to ensure that English is used for all project communication
      • No more than one exchange students per team Rationale: to increase interaction between exchange students and NUS students.
      • Same gender teams are discouraged but allowed. Rationale: to train you for mixed-gender work environments.
    • If you prefer not to form teams yourselves, not to worry; we'll put you in a team.
    • We may have to modify teams when circumstances call for it. There is no avenue for you to object. Staying with your preferred team is not guaranteed.

    Team ID

    • To be given to you after forming teams.
    • Has the form TUTORIAL_ID-TEAM_NUMBER e.g, CS2103-W14-2 means you are in tutorial CS2103-W14 (i.e., in course CS2103, on Wednesday, at 1400-1500), team 2.

    Team Communications

    • Use English for all team communications, both spoken and written.

    • We recommend at least one 1-2 hour synchronous (online or f2f) project meeting per week, in addition to any asynchronous communicating. Reason: Having all members available at the same time will facilitate easier collaboration and more peer-learning.

      • Fix a weekly 1-2 hour time slot for project meetings after the team has been finalized (latest by the end of week 3 tutorial). All members are expected to attend weekly project meetings (not doing so could lower the peer evaluation ratings you receive, which in turn will be factored into your grade). You should also fix a venue for the meetings, if you prefer F2F meetings.
      • The best time for the weekly project meeting is the period Saturday, Sunday, Monday, Tuesday i.e., soon after the weekly briefing but well ahead of the deadline for weekly tasks. Reason: After the briefing → so that you've been briefed about upcoming project tasks; well ahead of the deadline → so that you can use the meeting to plan/do weekly project tasks.
        -But it's OK to choose a timeslot outside of that recommended period too, if a suitable time cannot be found within that period.

    tP: ConstraintstP Week 3: Kickoff

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +But it's OK to choose a timeslot outside of that recommended period too, if a suitable time cannot be found within that period.

    tP: ConstraintstP Week 3: Kickoff

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-teams.page-vue-render.js b/admin/tp-teams.page-vue-render.js index 6533a4e7c1..a55bc59baf 100644 --- a/admin/tp-teams.page-vue-render.js +++ b/admin/tp-teams.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('div',{attrs:{"id":"teamCommunication","tags":"m--cs2103 m- with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Constraints")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w3.html"}},[_c('span',[_v("tP Week 3: Kickoff "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-timeline.html b/admin/tp-timeline.html index ecf4cd9463..ed19a8e2e0 100644 --- a/admin/tp-timeline.html +++ b/admin/tp-timeline.html @@ -23,7 +23,7 @@

    tP: ExpectationstP: Constraints


    tP: Timeline

    The tP spans ten weeks, and is to be done in breadth-first iterative fashion.

    The first portion of the tP will be spent of laying out the foundation for the iterations, as illustrated below. This portion of the tP is light because you will be doing the individual project (iP) in parallel during this time.

    Note: that the diagrams above show the relative size of tasks i.e., smaller tasks are shown as shorter bars

    Week 3 Kickoff

    • Form teams.
    • Set weekly meeting times.

    Week 4 Set direction

    • Decide on a general direction for the project (i.e., target user profile, and problem addressed).

    Week 5 Gather requirements

    • Gather requirements in the form of user stories.
    • Decide which of them will go into the first version.

    Week 6 Define the MVP

    • Decide how the MVP version of the product will look like (i.e., v1.3).

    The second portion of the tP is divided into multiple iterations, each of which is expected to produce a working version of the product by evolving the product delivered in the previous iteration.

    W7 Iter.1 [ Practice iteration → v1.1 ]

    • Learning outcome: Able to follow the workflow as a team.
    • Product goal: Update some documents to match the new product direction.
    • Strategy: Practice the workflow while updating the documents.

    Aim to do 'just enough': Note how the Product goal (together with the Strategy) is simply a means to achieve the Learning outcome. Unlike in a real SE project, the product in the tP exists only to help you achieve the learning outcome. Hence, aim to do 'just enough' work on the product to achieve the intended learning outcome of the iteration (e.g., don't make features bigger than necessary) so that the tP doesn't add to your workload more than necessary.

     W8  Iter.2 [ First feature increment → v1.2 ]

    • Learning outcome: Able to update functional code while working in parallel.
    • Product goal: Take the first step towards an MVP by delivering at least some functionality changes.
    • Strategy: Define the smallest possible MVP (simplest versions of must-have features only). Each member tries to merge at least one PR that moves the product towards that MVP.

     W9  Iter.3 [ MVP → v1.3 ]

    • Learning outcome: Able to deliver a fully working product, on time.
    • Product goal: Reach the .
    • Strategy: Decide on a plan to meet the MVP delivery deadline. Reduce risk by aiming for the smallest subset of must-have features.

    W10 Iter.4 [ Alpha version → v1.4 ]

    • Learning outcome: Able to tweak the product/project plan to match the available time/resources.
    • Product goal: Implement versions of all the features intended for final release.
    • Strategy: Add features based on priority, while maintaining a working product. It is OK if the features are rough around the edges, as they can be tweaked in the next iteration.

    W11 W12 Iter.5 [ Release candidate → v1.5 ]

    This iteration has an extra week, on account of holidays.

    • Learning outcome: Able to apply internal quality control.
    • Product goal: Reach the release candidate (RC) version, ready for a public beta testing (i.e., the product quality should be sufficiently high e.g., no obvious bugs).
    • Strategy: Do an internally, and refine features as necessary. Improve tests, documentation, code quality.

    This version (i.e., v1.5) will undergo a limited beta testing (done by other teams) and you will receive the bug reports without any penalty.

    W13 Iter.6 [ Public release → v1.6 ]

    • Learning outcome: Able to put in final touches while minimizing delivery risks i.e., risks of regressions or deadline overruns.
    • Product goal: Reach the quality necessary for a public release.
    • Strategy: Freeze features. Strictly limit changes to bug fixes only.
    • This iteration is very short (just a few days).
      Even minor/cosmetic changes to features are not allowed in this iteration due to the feature freeze enforced.
    • This version will be subjected to an intensive peer testing (the so-called practical exam). -You will get credit for finding bugs in others' tP deliverables and penalized for bugs found in your deliverables.

    tP: ExpectationstP: Constraints

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +You will get credit for finding bugs in others' tP deliverables and penalized for bugs found in your deliverables.

    tP: ExpectationstP: Constraints

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-timeline.page-vue-render.js b/admin/tp-timeline.page-vue-render.js index 0a9768df52..66d5e1dd7c 100644 --- a/admin/tp-timeline.page-vue-render.js +++ b/admin/tp-timeline.page-vue-render.js @@ -77,6 +77,6 @@ with(this){return _c('div',{staticClass:"indented",attrs:{"id":"v16-goals"}},[_c with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Expectations")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('span',[_v("tP: Constraints "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w10.html b/admin/tp-w10.html index 538985956c..4940156778 100644 --- a/admin/tp-w10.html +++ b/admin/tp-w10.html @@ -29,7 +29,7 @@ Remember to enable assertions in your IDEA run configurations and in the gradle file.

    FAQ Is it enough to update existing UML content/diagrams or must we add new content/diagrams?


    FAQ What if the features I added don't affect UML diagrams?


    Some other relevant FAQs, repeated from last week:

    FAQ Should we try to automate GUI testing as well?


    FAQ All tests pass locally, but the same code fails CI in the PR. How come?


    FAQ PR passed CI before merging, but fails CI after merging. How come?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    4 Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00

    • This activity is compulsory and counts for 3 participation points. Please do it before the weekly deadline.

    Some background: As you know, our includes peer-testing tP products under exam conditions. In the past, we used GitHub as the platform for that -- which was not optimal (e.g., it was hard to ensure the compulsory labels have been applied). As a remedy, some ex-students have been developing an app called that we'll be using for the PE this semester. We still use GitHub to record bugs reported in the PE but CATcher acts as a layer between you and GitHub, to ensure the bugs you report meet PE requirements.

    This week, we would like you to smoke-test the CATcher app to ensure it can work with your OS, Browser, GitHub account, by following the steps given in the panel below.

    • [Heads up] Load-testing CATcher will be done during the upcoming weekly briefing (Fri, Oct 25th ), during the first 15 minutes of briefing. This is different from smoke-testing you did above, and this will count for participation separately.
      Therefore, remember to attend the briefing (via Zoom or F2F) at least for the first 15 minutes (this activity cannot be done any other time).

    5 Start updating UML diagrams in the DG

    This is a good time to get familiar with the diagramming tools used by the tP.

    • Each member is recommended to update at least one UML diagram in the DG, to match the changes you've done so far in v1.4. You may do this towards the end of v1.4, or soon after you finish it.
    • Deadline: This is not part of v1.4. So, you can do this even after you are done with the v1.4 release that is due Thursday 23:59.
      -As this is a regular weekly task, the usual deadline applies i.e., Friday 1600, and as usual, if you miss the deadline, catching up within a few days will still turn it green.
    • Updating the DG text to match the diagrams is optional (it can be done later).
    • FYI, the panel below has some DG tips, some of which are related to drawing diagrams.

    FAQ Why not wait till the end to add/update the DG diagrams?


    End of tP Week 10

    Have any suggestions to improve AB3?

    Now that you have worked with AB3 codebase for a while, if you have any suggestions on how to improve AB3 (for future batches), feel free to post/discuss them in the forum.
    Examples: places where the design/code can be simplified, hard to understand parts of the code, tips you can share with future batches, ...


    tP Week 9: MVP → v1.3tP Week 11: Release candidate → v1.5

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +As this is a regular weekly task, the usual deadline applies i.e., Friday 1600, and as usual, if you miss the deadline, catching up within a few days will still turn it green.
  • Updating the DG text to match the diagrams is optional (it can be done later).
  • FYI, the panel below has some DG tips, some of which are related to drawing diagrams.
  • FAQ Why not wait till the end to add/update the DG diagrams?


    End of tP Week 10

    Have any suggestions to improve AB3?

    Now that you have worked with AB3 codebase for a while, if you have any suggestions on how to improve AB3 (for future batches), feel free to post/discuss them in the forum.
    Examples: places where the design/code can be simplified, hard to understand parts of the code, tips you can share with future batches, ...


    tP Week 9: MVP → v1.3tP Week 11: Release candidate → v1.5

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w10.page-vue-render.js b/admin/tp-w10.page-vue-render.js index bca52c7e1c..294955e631 100644 --- a/admin/tp-w10.page-vue-render.js +++ b/admin/tp-w10.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"font-weight-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Admin info")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseOverview.html"}},[_v("Course Overview")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('mark',[_v("Using this Website")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseExpectations.html"}},[_v("Course Expectations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Course Structure \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('small',[_v("Course Briefing Videos")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('small',[_v("Weekly Schedule")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/lectures.html"}},[_c('small',[_v("Weekly Briefings")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_c('small',[_v("Tutorials")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/instructors.html"}},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/textbooks.html"}},[_v("Textbooks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/programmingLanguages.html"}},[_v("Programming Language")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_v("Standards/Conventions")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Individual Project (iP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-overview.html"}},[_c('small',[_v("iP (Individual Project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w2.html"}},[_c('small',[_v("iP: Week 2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w3.html"}},[_c('small',[_v("iP: Week 3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w4.html"}},[_c('small',[_v("iP: Week 4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w5.html"}},[_c('small',[_v("iP: Week 5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w6.html"}},[_c('small',[_v("iP: Week 6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w7.html"}},[_c('small',[_v("iP: Week 7")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w8.html"}},[_c('small',[_v("iP: Week 8")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-grading.html"}},[_c('small',[_v("iP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Team Project (tP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-overview.html"}},[_c('small',[_v("tP (team project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('small',[_v("tP: Expectations")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('small',[_v("tP: Timeline")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('small',[_v("tP: Constraints")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-teams.html"}},[_c('small',[_v("tP: Forming Teams")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w3.html"}},[_c('small',[_v("tP Week 3: Kickoff")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w4.html"}},[_c('small',[_v("tP Week 4: Set direction")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w5.html"}},[_c('small',[_v("tP Week 5: Gather requirements")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w6.html"}},[_c('small',[_v("tP Week 6: Define the MVP")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w7.html"}},[_c('small',[_v("tP Week 7: Practice iteration → v1.1")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w8.html"}},[_c('small',[_v("tP Week 8: First feature increment → v1.2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w9.html"}},[_c('small',[_v("tP Week 9: MVP → v1.3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w10.html"}},[_c('small',[_v("tP Week 10: Alpha version → v1.4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w11.html"}},[_c('small',[_v("tP Week 11: Release candidate → v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w12.html"}},[_c('small',[_v("tP Week 12: Extra week for v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w13.html"}},[_c('small',[_v("tP Week 13: Public release → v1.6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('small',[_v("tP: Deliverables")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-ped.html"}},[_c('small',[_v("tP: Practical Exam Dry Run")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-pe.html"}},[_c('small',[_v("tP: Practical Exam")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('small',[_v("tP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('small',[_v("tP: Supervision/Guidance")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/peerEvaluations.html"}},[_v("Peer Evaluations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tools.html"}},[_v("Tools")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/exams.html"}},[_v("Exams")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/participation.html"}},[_v("Participation Marks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_v("Grade Breakdown")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Appendices \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('small',[_v("Apdx A: Course Principles")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('small',[_v("Apdx B: Course Policies")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('small',[_v("Apdx C: FAQ")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('small',[_v("Apdx D: Getting Help")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('small',[_v("Apdx E: Using GitHub")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('small',[_v("Apdx F: Handling Team Issues")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])])])])])],1)],1)])]),_v(" "),_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('br'),_v(" "),_m(1),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',{staticClass:"lead border-bottom border-left ml-3 mb-3",staticStyle:{"color":"purple"},attrs:{"id":"summary"}},[_c('ol',[_m(2),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_c('li',[_m(5),_v(" "),_m(6),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1)]),_v(" "),_m(7)])]),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(8),_v(" "),_m(9),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"45%","y":"67%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.4")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to tweak the product/project plan to match the available time/resources.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Implement "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., "),_c('em',[_v("almost")]),_v(" complete implementation of the feature, even if not fully polished")]},proxy:true}])},[_v("fully-fledged")]),_v(" versions of "),_c('em',[_v("all")]),_v(" the features intended for final release.")],1)]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Add features based on priority, while maintaining a working product. It is OK if the features are rough around the edges, as they can be tweaked in the next iteration.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("In this iteration, we learn from past iterations, and aim to better plan and better deliver another functional increment")]),_v(" that would get you very very close to the final version in terms of raw functionality."),_c('br'),_v("\nWe call this the "),_c('em',[_v("alpha version")]),_v(" because "),_c('strong',[_v("this version is meant to be good enough for "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("testing done by internal testers")]},proxy:true}])},[_c('em',[_v("alpha testing")])])],1),_v(" of the product.")]),_v(" "),_m(10),_v(" "),_m(11),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How much code/features is enough to get full marks?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not surprisingly, a common question tutors receive is \"can you look at our project and tell us if we have done enough to get full marks?\". Here's the answer to that question:")]),_v(" "),_c('p',[_c('strong',[_v("The tP "),_c('em',[_v("effort")]),_v(" is graded primarily based on peer judgements")]),_v(" (tutor judgements are used too). That means you will be judging the effort of another team later, which also means you should be able to make a similar judgement for your own project now. While we understand effort estimating is hard for software projects, it is an essential SE skill, and we must practice it when we can.")]),_v(" "),_c('p',[_c('strong',[_v("The expected minimum bar to get full marks for "),_c('em',[_v("effort")])]),_v(" is given "),_c('trigger',{attrs:{"trigger":"click","for":"modal:mid13-effortBar"}},[_v(" here")]),_v(".")],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:mid13-effortBar"},scopedSlots:_u([{key:"header",fn:function(){return [_v("tP -> Expectations -> [Extract] Functionality Expectations")]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("The expected level of "),_c('em',[_v("functionality")]),_v(" is what you could achieve if each member puts in about "),_c('mark',[_v("50% of the implementation effort they put into the iP")])]),_v(" (reason for setting it much less than 100%: even after adding the extra overheads of doing the project as a team, and working with an exising codebase, we don't want the tP to take more effort than the iP)."),_c('br'),_v("\nFurthermore, we estimate that the above-mentioned bar is roughly "),_c('em',[_v("equivalent")]),_v(" to "),_c('strong',[_v("writing about 300-400 lines of functional code")]),_v(" (excluding testing and documentation) per person.")]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_v("In case you happen to look at tP's of past batches (2023 and before) in order to gauge the required effort, note that the above reflects a "),_c('mark',[_v("drastically lower bar from those semesters")]),_v(". For reference, the bar given to previous batches was 'same as iP effort' (not half), and the median LoC of functional code written by a student was about 850 LoC.")])])],1)]),_v(" "),_c('p',[_v("If you surpass the above bars (in your own estimation), you should be in a good position to receive full marks for the effort. But keep in mind that there are many other components in the "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_v("tP grading")]),_v(", not just the effort.")])],1)])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"warning","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Heads up: this is a BIG week of the tP!")])]},proxy:true}])},[_v(" "),_c('p',[_v("Ideally, the tP work should be distributed equally across all tP works. In practice though, this can be uneven based on your other commitments "),_c('span',{staticClass:"dimmed"},[_v("e.g., most did less work in week 7-8 due to midterm exams")]),_v(".")]),_v(" "),_c('p',[_c('mark',[_v("If you were to pick one tP week to push the hardest, this week should be it!")]),_v(" That is because in this iteration you need to implement all features that you plan to include in the final version (but they need not be fully polished).")])])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(12),_v(" "),_m(13),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(14),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Like to try a new Git workflow?")]),_v(" If you feel you are now comfortable with the forking workflow, and now you would like to practice another one, your team can choose to follow the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:postmortemTip-featurebranchworkflow"}},[_v("feature branch workflow")]),_v(" from now on.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:postmortemTip-featurebranchworkflow"},scopedSlots:_u([{key:"header",fn:function(){return [_v("TextBook "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Project Management → Revision Control →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"feature-branch-flow"}},[_c('span',[_v("Feature branch flow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-branch-flow","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Feature branch")]),_v(" workflow is similar to forking workflow except there are no forks.")]),_v(" Everyone is pushing/pulling from the same remote repo. The phrase "),_c('em',[_v("feature branch")]),_v(" is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.")]),_v(" "),_c('p',[_v("As this workflow require all team members to have write access to the repository,")]),_v(" "),_c('ul',[_c('li',[_v("it is better to "),_c('em',[_v("protect")]),_v(" the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.")]),_v(" "),_c('li',[_v("it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.")])]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/book/revisionControl/featureBranchFlow/images/diagram.png","height":"330"}}),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#feature-branch-workflow"}},[_v("A detailed explanation of the Feature Branch Workflow")]),_v(" - From Atlassian")])])])])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-plan-the-alpha-version-v1-4"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(15),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-plan-the-alpha-version-v1-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"secondary","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_v("The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.")])]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('small',[_v("--Tom Cargill, Bell Labs")])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide the scope:")]),_v(" Start by deciding what features you would include in the final product "),_c('span',{staticClass:"underline"},[_v("if you had only one more week to deliver")]),_v(" them. In this iteration, aim to deliver at least a "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the feature is working and accessible to users, although it might not handle all the corner cases, and the UI/UX might not be fully polished yet")]},proxy:true}])},[_v("fully-fledged (albeit not-yet-polished)")]),_v(" version of those features."),_c('br'),_v(" "),_m(16),_v(" We will be enforcing a strict "),_c('em',[_v("feature freeze")]),_v(" at the end of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(" (more details in the panel below). Given you also need time to polish the features before the feature freeze starts (during which feature tweaks are not allowed), it makes sense to finish the bulk of the feature implementation in this iteration ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.4")]),_v("), so that you have time to test and polish it in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(".")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_m(17)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(18),_v(" "),_m(19),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(20),_v(" "),_c('box',[_c('h5',{staticClass:"text-success",attrs:{"id":"ways-to-level-up-your-tp-game"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ways-to-level-up-your-tp-game","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('span',{staticClass:"text-success"},[_c('strong',[_v("Use parallel PRs:")])]),_v(" We encourage you to try sending parallel PRs (i.e., send another PR while the previous PR you sent is waiting to be merged) if you haven't done that yet. "),_c('span',{staticClass:"dimmed"},[_v("Reason: It's important to learn how to do that, because in most real projects it is common to have multiple open PRs from the same author.")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_v("Maintain the defensiveness of the code:")]),_v(" Use assertions, exceptions, and logging in your code, as well as other defensive programming measures (refer this week's topic on "),_c('em',[_v("defensive programming")]),_v(" for more details) when appropriate. This will be considered when grading your tP code quality."),_c('br'),_v("\nRemember to "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/intellijUsefulSettings.html"}},[_v("enable assertions in your IDEA run configurations")]),_v(" and "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/gradle.html#enabling-assertions"}},[_v("in the gradle file")]),_v(".")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_m(21),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Should we try to automate GUI testing as well?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Automated GUI testing is hard, especially in Desktop apps, especially in CI (because the environment that CI runs doesn't have a display device to show the GUI).")]),_v(" "),_c('p',[_v("A few years ago, we used "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(" as the starting point of the tP.")]),_v(" "),_c('ul',[_c('li',[_v("The main difference between AB4 and AB3? AB4 has automated GUI testing. It used the TestFX tool to do so, and ran the test in 'headless' mode in CI (i.e., simulate a display device without an actual display device).")]),_v(" "),_c('li',[_v("The main reason we changed tP to start with AB3 code was that some students found it too hard to maintain those GUI tests.")])]),_v(" "),_c('p',[_v("While we don't require you to automate GUI testing in your tP (i.e., it is fine to do only manual GUI testing), you are welcome to give it a try too, especially if you like a technical challenge.")]),_v(" "),_c('ul',[_c('li',[_v("Even if you get it working in only some OS'es only, and only in local environment, it is still a useful way to test the GUI quickly.")]),_v(" "),_c('li',[_v("It is possible to run tests selectively, which means you can still run them in environments they work and skip them in other environments.")])]),_v(" "),_c('p',[_v("Feel free to reuse/refer AB4 code too. If you manage to make some headway in this direction, you are encouraged to share it with others via the forum.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("All tests pass locally, but the same code fails CI in the PR. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("First, check which OS it is failing in. Some behaviors can be OS-dependent. For example, file paths are case-insensitive in Windows but not in Unix/Mac.")]),_v(" "),_c('p',[_v("Second, note that PR CI does a temporary merge of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to the PR branch before running tests, to verify if the checks will pass "),_c('em',[_v("after")]),_v(" you merge this PR. So, if the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has progressed after you started your PR branch, those new commits can affect the CI result. The remedy is to pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your repo, merge it to your PR branch, and run tests again (which should fail as well, but you can now find the reason for the failure and fix it).")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR passed CI before merging, but fails CI after merging. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("It is possible that the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has received new commits after your PR passed CI the last time. So, if GitHub indicates that your PR is not up-to-date with the latest "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, synchronize your PR branch with the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch (which will run the CI again) before merging it.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR CI fails because Codecov reports a drop in code coverage. What to do?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In some cases the code edited by the PR is not covered by existing tests, which means Codecov will report it as not adhering to the current coverage targets.")]),_v(" "),_c('p',[_v("First, find out which area of the code is causing the coverage drop. You can use Codecov or code coverage features of the IDE to do so.")]),_v(" "),_c('p',[_v("Then you can do the following:")]),_v(" "),_c('ul',[_c('li',[_v("Ignore those warnings, and merge the PR (a member with admin permissions can merge a CI-failing PR). Suitable for cases such as,\n"),_c('ul',[_c('li',[_v("the coverage drop is in code that is not normally covered by automated tests and/or 'not worth the effort to' test automatically (e.g., GUI).")]),_v(" "),_c('li',[_v("you deem that automated testing of that part of the code can be done at a later time (i.e., not a priority at the current time).")])])]),_v(" "),_c('li',[_v("Alternatively, update tests until the coverage is raised back to sufficient level.")])]),_v(" "),_c('p',[_v("Note that Codecov is there to help you manage code coverage -- it is not graded. You may lower the test coverage targets set for Codecov as well.")]),_v(" "),_c('p',[_v("For reference,")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p')])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Are we allowed to deviate from the MVP Feature Specification submitted earlier?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, the submitted "),_c('em',[_v("MVP Feature Specification")]),_v(" is not binding (its purpose was to get you to think about feature details early -- we will not be looking at it again). You may change features as needed along the way. Just ensure your changes do not violate "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("tp constraints")]),_v(".")]),_v(" "),_c('p',[_v("No need to resubmit the Feature Spec either. However, if you change the product name, target user, or the value proposition, (which is allowed too) please email the updated values to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(".")])])])],1)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(22),_v(" "),_m(23),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(24),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"dismissible":""}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" Some background:")]),_v(" As you know, our "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., Practical Exam")]},proxy:true}])},[_v("PE")]),_v(" includes peer-testing tP products under exam conditions. In the past, we used GitHub as the platform for that -- which was not optimal (e.g., it was hard to ensure the compulsory labels have been applied). As a remedy, some ex-students have been developing an app called "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("CAT stands for Crowd-sourced Anonymous Testing")]},proxy:true}])},[_v("CATcher")]),_v(" that we'll be using for the PE this semester. We still use GitHub to record bugs reported in the PE but CATcher acts as a layer between you and GitHub, to ensure the bugs you report meet PE requirements.")],1)])]),_v(" "),_m(25),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Steps for smoke-testing CATcher:")])])]},proxy:true}])},[_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Go to the CATcher Web version")]),_v(" at "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("https://catcher-org.github.io/CATcher/")]),_v(" using "),_c('mark',[_v("the same computer (i.e., not a mobile device) that you plan to use for the practical exam")]),_v(".\n"),_c('ul',[_c('li',[_v("Use a common browser such as Chrome, Edge, Firefox, Safari")]),_v(" "),_c('li',[_v("Allow popups from "),_c('a',{attrs:{"href":"https://catcher-org.github.io/"}},[_v("https://catcher-org.github.io/")])]),_v(" "),_c('li',[_v("If you encounter other problems at the app launch, refer to the "),_c('a',{attrs:{"href":"https://catcher-org.github.io/ug/"}},[_v("Notes on using CATcher")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("Login")]),_v(": Choose the "),_c('em',[_v("session")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T Smoke Test")]),_v(", and submit.\n"),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/catcherLogin.png"}})],1),_v(" "),_c('li',[_v("In the next screen, login to CATcher using your GitHub account."),_c('br'),_v("\nIf the app asks for public repo access permissions, grant it (just go with the default settings).")]),_v(" "),_c('li',[_c('strong',[_v("Let CATcher create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")])]),_v(" in your GitHub account, when it asks for permission. That repo will be used to hold the bug reports you will create in this testing session.")]),_v(" "),_c('li',[_c('strong',[_v("Use CATcher (not the GitHub Web/Mobile interface) to create 1-2 "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., bug reports containing some random content")]},proxy:true}])},[_v("dummy bug reports")])],1),_v(". The steps are similar to how you would enter bug reports in the GitHub issue tracker. Include at least one screenshot in one of those bug reports."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" you can "),_c('mark',[_v("copy-paste screenshots")]),_v(" into the bug description."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use Markdown syntax in the bug descriptions."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type")]),_v(" labels are compulsory.")]),_v(" "),_c('li',[_c('strong',[_v("Report any problems you encounter")]),_v(" at the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Do NOT delete the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")]),_v(" repo")]),_v(" created by CATcher in your GitHub account (keep it until the end of the semester) as our scripts will look for it later to check if you have done this activity.")])])]),_v(" "),_c('p')],1),_v(" "),_m(26)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-start-updating-uml-diagrams-in-the-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(27),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-start-updating-uml-diagrams-in-the-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("This is a good time to get familiar with the diagramming tools used by the tP.")])]),_v(" "),_m(28),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"light","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('div',{staticClass:"card-title"},[_c('p',[_c('span',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Deliverables → DG → Tips")])])])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)])]),_v(" "),_c('p')],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Why not wait till the end to add/update the DG diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Here are some reasons:")]),_v(" "),_c('ul',[_c('li',[_v("We want you to take at least two passes at documenting the project so that you can learn how to evolve the documentation along with the code "),_c('span',{staticClass:"dimmed"},[_v("(which requires additional considerations, when compared to documenting the project only once)")]),_v(".")]),_v(" "),_c('li',[_v("It is better to get used to the documentation tool chain early, to avoid unexpected problems near the final submission deadline.")]),_v(" "),_c('li',[_v("It allows receiving early self/peer/instructor feedback.")])])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_m(29)])]),_v(" "),_c('br'),_v(" "),_m(30)])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-week-10-alpha-version-v1-4"}},[_v("tP Week 10: Alpha version → v1.4 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-10"}},[_v("Intro to tP Week 10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_v("1 Do a postmortem of the previous iteration before the tutorial‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-plan-the-alpha-version-v1-4"}},[_v("2 Plan the alpha version (v1.4)‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_v("3 Deliver the alpha version (v1.4) Thu, Oct 24th 23:59‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_v("4 Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00 counted for participation‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-start-updating-uml-diagrams-in-the-dg"}},[_v("5 Start updating UML diagrams in the DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#end-of-tp-week-10"}},[_v("End of tP Week 10‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(31)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"font-weight-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Admin info")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseOverview.html"}},[_v("Course Overview")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('mark',[_v("Using this Website")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseExpectations.html"}},[_v("Course Expectations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Course Structure \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('small',[_v("Course Briefing Videos")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('small',[_v("Weekly Schedule")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/lectures.html"}},[_c('small',[_v("Weekly Briefings")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_c('small',[_v("Tutorials")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/instructors.html"}},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/textbooks.html"}},[_v("Textbooks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/programmingLanguages.html"}},[_v("Programming Language")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_v("Standards/Conventions")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Individual Project (iP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-overview.html"}},[_c('small',[_v("iP (Individual Project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w2.html"}},[_c('small',[_v("iP: Week 2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w3.html"}},[_c('small',[_v("iP: Week 3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w4.html"}},[_c('small',[_v("iP: Week 4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w5.html"}},[_c('small',[_v("iP: Week 5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w6.html"}},[_c('small',[_v("iP: Week 6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w7.html"}},[_c('small',[_v("iP: Week 7")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w8.html"}},[_c('small',[_v("iP: Week 8")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-grading.html"}},[_c('small',[_v("iP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Team Project (tP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-overview.html"}},[_c('small',[_v("tP (team project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('small',[_v("tP: Expectations")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('small',[_v("tP: Timeline")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('small',[_v("tP: Constraints")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-teams.html"}},[_c('small',[_v("tP: Forming Teams")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w3.html"}},[_c('small',[_v("tP Week 3: Kickoff")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w4.html"}},[_c('small',[_v("tP Week 4: Set direction")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w5.html"}},[_c('small',[_v("tP Week 5: Gather requirements")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w6.html"}},[_c('small',[_v("tP Week 6: Define the MVP")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w7.html"}},[_c('small',[_v("tP Week 7: Practice iteration → v1.1")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w8.html"}},[_c('small',[_v("tP Week 8: First feature increment → v1.2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w9.html"}},[_c('small',[_v("tP Week 9: MVP → v1.3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w10.html"}},[_c('small',[_v("tP Week 10: Alpha version → v1.4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w11.html"}},[_c('small',[_v("tP Week 11: Release candidate → v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w12.html"}},[_c('small',[_v("tP Week 12: Extra week for v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w13.html"}},[_c('small',[_v("tP Week 13: Public release → v1.6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('small',[_v("tP: Deliverables")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-ped.html"}},[_c('small',[_v("tP: Practical Exam Dry Run")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-pe.html"}},[_c('small',[_v("tP: Practical Exam")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('small',[_v("tP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('small',[_v("tP: Supervision/Guidance")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/peerEvaluations.html"}},[_v("Peer Evaluations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tools.html"}},[_v("Tools")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/exams.html"}},[_v("Exams")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/participation.html"}},[_v("Participation Marks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_v("Grade Breakdown")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Appendices \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('small',[_v("Apdx A: Course Principles")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('small',[_v("Apdx B: Course Policies")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('small',[_v("Apdx C: FAQ")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('small',[_v("Apdx D: Getting Help")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('small',[_v("Apdx E: Using GitHub")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('small',[_v("Apdx F: Handling Team Issues")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])])])])])],1)],1)])]),_v(" "),_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('br'),_v(" "),_m(1),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',{staticClass:"lead border-bottom border-left ml-3 mb-3",staticStyle:{"color":"purple"},attrs:{"id":"summary"}},[_c('ol',[_m(2),_v(" "),_m(3),_v(" "),_m(4),_v(" "),_c('li',[_m(5),_v(" "),_m(6),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1)]),_v(" "),_m(7)])]),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(8),_v(" "),_m(9),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"45%","y":"67%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.4")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to tweak the product/project plan to match the available time/resources.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Implement "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., "),_c('em',[_v("almost")]),_v(" complete implementation of the feature, even if not fully polished")]},proxy:true}])},[_v("fully-fledged")]),_v(" versions of "),_c('em',[_v("all")]),_v(" the features intended for final release.")],1)]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Add features based on priority, while maintaining a working product. It is OK if the features are rough around the edges, as they can be tweaked in the next iteration.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("In this iteration, we learn from past iterations, and aim to better plan and better deliver another functional increment")]),_v(" that would get you very very close to the final version in terms of raw functionality."),_c('br'),_v("\nWe call this the "),_c('em',[_v("alpha version")]),_v(" because "),_c('strong',[_v("this version is meant to be good enough for "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("testing done by internal testers")]},proxy:true}])},[_c('em',[_v("alpha testing")])])],1),_v(" of the product.")]),_v(" "),_m(10),_v(" "),_m(11),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How much code/features is enough to get full marks?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not surprisingly, a common question tutors receive is \"can you look at our project and tell us if we have done enough to get full marks?\". Here's the answer to that question:")]),_v(" "),_c('p',[_c('strong',[_v("The tP "),_c('em',[_v("effort")]),_v(" is graded primarily based on peer judgements")]),_v(" (tutor judgements are used too). That means you will be judging the effort of another team later, which also means you should be able to make a similar judgement for your own project now. While we understand effort estimating is hard for software projects, it is an essential SE skill, and we must practice it when we can.")]),_v(" "),_c('p',[_c('strong',[_v("The expected minimum bar to get full marks for "),_c('em',[_v("effort")])]),_v(" is given "),_c('trigger',{attrs:{"trigger":"click","for":"modal:mid13-effortBar"}},[_v(" here")]),_v(".")],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:mid13-effortBar"},scopedSlots:_u([{key:"header",fn:function(){return [_v("tP -> Expectations -> [Extract] Functionality Expectations")]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("The expected level of "),_c('em',[_v("functionality")]),_v(" is what you could achieve if each member puts in about "),_c('mark',[_v("50% of the implementation effort they put into the iP")])]),_v(" (reason for setting it much less than 100%: even after adding the extra overheads of doing the project as a team, and working with an exising codebase, we don't want the tP to take more effort than the iP)."),_c('br'),_v("\nFurthermore, we estimate that the above-mentioned bar is roughly "),_c('em',[_v("equivalent")]),_v(" to "),_c('strong',[_v("writing about 300-400 lines of functional code")]),_v(" (excluding testing and documentation) per person.")]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_v("In case you happen to look at tP's of past batches (2023 and before) in order to gauge the required effort, note that the above reflects a "),_c('mark',[_v("drastically lower bar from those semesters")]),_v(". For reference, the bar given to previous batches was 'same as iP effort' (not half), and the median LoC of functional code written by a student was about 850 LoC.")])])],1)]),_v(" "),_c('p',[_v("If you surpass the above bars (in your own estimation), you should be in a good position to receive full marks for the effort. But keep in mind that there are many other components in the "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_v("tP grading")]),_v(", not just the effort.")])],1)])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"warning","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Heads up: this is a BIG week of the tP!")])]},proxy:true}])},[_v(" "),_c('p',[_v("Ideally, the tP work should be distributed equally across all tP works. In practice though, this can be uneven based on your other commitments "),_c('span',{staticClass:"dimmed"},[_v("e.g., most did less work in week 7-8 due to midterm exams")]),_v(".")]),_v(" "),_c('p',[_c('mark',[_v("If you were to pick one tP week to push the hardest, this week should be it!")]),_v(" That is because in this iteration you need to implement all features that you plan to include in the final version (but they need not be fully polished).")])])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(12),_v(" "),_m(13),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(14),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Like to try a new Git workflow?")]),_v(" If you feel you are now comfortable with the forking workflow, and now you would like to practice another one, your team can choose to follow the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:postmortemTip-featurebranchworkflow"}},[_v("feature branch workflow")]),_v(" from now on.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:postmortemTip-featurebranchworkflow"},scopedSlots:_u([{key:"header",fn:function(){return [_v("TextBook "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Project Management → Revision Control →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"feature-branch-flow"}},[_c('span',[_v("Feature branch flow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-branch-flow","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Feature branch")]),_v(" workflow is similar to forking workflow except there are no forks.")]),_v(" Everyone is pushing/pulling from the same remote repo. The phrase "),_c('em',[_v("feature branch")]),_v(" is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.")]),_v(" "),_c('p',[_v("As this workflow require all team members to have write access to the repository,")]),_v(" "),_c('ul',[_c('li',[_v("it is better to "),_c('em',[_v("protect")]),_v(" the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.")]),_v(" "),_c('li',[_v("it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.")])]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/book/revisionControl/featureBranchFlow/images/diagram.png","height":"330"}}),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#feature-branch-workflow"}},[_v("A detailed explanation of the Feature Branch Workflow")]),_v(" - From Atlassian")])])])])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-plan-the-alpha-version-v1-4"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(15),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-plan-the-alpha-version-v1-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"secondary","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_v("The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.")])]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('small',[_v("--Tom Cargill, Bell Labs")])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide the scope:")]),_v(" Start by deciding what features you would include in the final product "),_c('span',{staticClass:"underline"},[_v("if you had only one more week to deliver")]),_v(" them. In this iteration, aim to deliver at least a "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the feature is working and accessible to users, although it might not handle all the corner cases, and the UI/UX might not be fully polished yet")]},proxy:true}])},[_v("fully-fledged (albeit not-yet-polished)")]),_v(" version of those features."),_c('br'),_v(" "),_m(16),_v(" We will be enforcing a strict "),_c('em',[_v("feature freeze")]),_v(" at the end of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(" (more details in the panel below). Given you also need time to polish the features before the feature freeze starts (during which feature tweaks are not allowed), it makes sense to finish the bulk of the feature implementation in this iteration ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.4")]),_v("), so that you have time to test and polish it in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(".")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_m(17)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(18),_v(" "),_m(19),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(20),_v(" "),_c('box',[_c('h5',{staticClass:"text-success",attrs:{"id":"ways-to-level-up-your-tp-game"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ways-to-level-up-your-tp-game","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('span',{staticClass:"text-success"},[_c('strong',[_v("Use parallel PRs:")])]),_v(" We encourage you to try sending parallel PRs (i.e., send another PR while the previous PR you sent is waiting to be merged) if you haven't done that yet. "),_c('span',{staticClass:"dimmed"},[_v("Reason: It's important to learn how to do that, because in most real projects it is common to have multiple open PRs from the same author.")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_v("Maintain the defensiveness of the code:")]),_v(" Use assertions, exceptions, and logging in your code, as well as other defensive programming measures (refer this week's topic on "),_c('em',[_v("defensive programming")]),_v(" for more details) when appropriate. This will be considered when grading your tP code quality."),_c('br'),_v("\nRemember to "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/intellijUsefulSettings.html"}},[_v("enable assertions in your IDEA run configurations")]),_v(" and "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/gradle.html#enabling-assertions"}},[_v("in the gradle file")]),_v(".")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_m(21),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Should we try to automate GUI testing as well?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Automated GUI testing is hard, especially in Desktop apps, especially in CI (because the environment that CI runs doesn't have a display device to show the GUI).")]),_v(" "),_c('p',[_v("A few years ago, we used "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(" as the starting point of the tP.")]),_v(" "),_c('ul',[_c('li',[_v("The main difference between AB4 and AB3? AB4 has automated GUI testing. It used the TestFX tool to do so, and ran the test in 'headless' mode in CI (i.e., simulate a display device without an actual display device).")]),_v(" "),_c('li',[_v("The main reason we changed tP to start with AB3 code was that some students found it too hard to maintain those GUI tests.")])]),_v(" "),_c('p',[_v("While we don't require you to automate GUI testing in your tP (i.e., it is fine to do only manual GUI testing), you are welcome to give it a try too, especially if you like a technical challenge.")]),_v(" "),_c('ul',[_c('li',[_v("Even if you get it working in only some OS'es only, and only in local environment, it is still a useful way to test the GUI quickly.")]),_v(" "),_c('li',[_v("It is possible to run tests selectively, which means you can still run them in environments they work and skip them in other environments.")])]),_v(" "),_c('p',[_v("Feel free to reuse/refer AB4 code too. If you manage to make some headway in this direction, you are encouraged to share it with others via the forum.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("All tests pass locally, but the same code fails CI in the PR. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("First, check which OS it is failing in. Some behaviors can be OS-dependent. For example, file paths are case-insensitive in Windows but not in Unix/Mac.")]),_v(" "),_c('p',[_v("Second, note that PR CI does a temporary merge of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to the PR branch before running tests, to verify if the checks will pass "),_c('em',[_v("after")]),_v(" you merge this PR. So, if the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has progressed after you started your PR branch, those new commits can affect the CI result. The remedy is to pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your repo, merge it to your PR branch, and run tests again (which should fail as well, but you can now find the reason for the failure and fix it).")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR passed CI before merging, but fails CI after merging. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("It is possible that the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has received new commits after your PR passed CI the last time. So, if GitHub indicates that your PR is not up-to-date with the latest "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, synchronize your PR branch with the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch (which will run the CI again) before merging it.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR CI fails because Codecov reports a drop in code coverage. What to do?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In some cases the code edited by the PR is not covered by existing tests, which means Codecov will report it as not adhering to the current coverage targets.")]),_v(" "),_c('p',[_v("First, find out which area of the code is causing the coverage drop. You can use Codecov or code coverage features of the IDE to do so.")]),_v(" "),_c('p',[_v("Then you can do the following:")]),_v(" "),_c('ul',[_c('li',[_v("Ignore those warnings, and merge the PR (a member with admin permissions can merge a CI-failing PR). Suitable for cases such as,\n"),_c('ul',[_c('li',[_v("the coverage drop is in code that is not normally covered by automated tests and/or 'not worth the effort to' test automatically (e.g., GUI).")]),_v(" "),_c('li',[_v("you deem that automated testing of that part of the code can be done at a later time (i.e., not a priority at the current time).")])])]),_v(" "),_c('li',[_v("Alternatively, update tests until the coverage is raised back to sufficient level.")])]),_v(" "),_c('p',[_v("Note that Codecov is there to help you manage code coverage -- it is not graded. You may lower the test coverage targets set for Codecov as well.")]),_v(" "),_c('p',[_v("For reference,")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p')])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Are we allowed to deviate from the MVP Feature Specification submitted earlier?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, the submitted "),_c('em',[_v("MVP Feature Specification")]),_v(" is not binding (its purpose was to get you to think about feature details early -- we will not be looking at it again). You may change features as needed along the way. Just ensure your changes do not violate "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("tp constraints")]),_v(".")]),_v(" "),_c('p',[_v("No need to resubmit the Feature Spec either. However, if you change the product name, target user, or the value proposition, (which is allowed too) please email the updated values to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(".")])])])],1)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(22),_v(" "),_m(23),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(24),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"dismissible":""}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" Some background:")]),_v(" As you know, our "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., Practical Exam")]},proxy:true}])},[_v("PE")]),_v(" includes peer-testing tP products under exam conditions. In the past, we used GitHub as the platform for that -- which was not optimal (e.g., it was hard to ensure the compulsory labels have been applied). As a remedy, some ex-students have been developing an app called "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("CAT stands for Crowd-sourced Anonymous Testing")]},proxy:true}])},[_v("CATcher")]),_v(" that we'll be using for the PE this semester. We still use GitHub to record bugs reported in the PE but CATcher acts as a layer between you and GitHub, to ensure the bugs you report meet PE requirements.")],1)])]),_v(" "),_m(25),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Steps for smoke-testing CATcher:")])])]},proxy:true}])},[_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Go to the CATcher Web version")]),_v(" at "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("https://catcher-org.github.io/CATcher/")]),_v(" using "),_c('mark',[_v("the same computer (i.e., not a mobile device) that you plan to use for the practical exam")]),_v(".\n"),_c('ul',[_c('li',[_v("Use a common browser such as Chrome, Edge, Firefox, Safari")]),_v(" "),_c('li',[_v("Allow popups from "),_c('a',{attrs:{"href":"https://catcher-org.github.io/"}},[_v("https://catcher-org.github.io/")])]),_v(" "),_c('li',[_v("If you encounter other problems at the app launch, refer to the "),_c('a',{attrs:{"href":"https://catcher-org.github.io/ug/"}},[_v("Notes on using CATcher")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("Login")]),_v(": Choose the "),_c('em',[_v("session")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T Smoke Test")]),_v(", and submit.\n"),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/catcherLogin.png"}})],1),_v(" "),_c('li',[_v("In the next screen, login to CATcher using your GitHub account."),_c('br'),_v("\nIf the app asks for public repo access permissions, grant it (just go with the default settings).")]),_v(" "),_c('li',[_c('strong',[_v("Let CATcher create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")])]),_v(" in your GitHub account, when it asks for permission. That repo will be used to hold the bug reports you will create in this testing session.")]),_v(" "),_c('li',[_c('strong',[_v("Use CATcher (not the GitHub Web/Mobile interface) to create 1-2 "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., bug reports containing some random content")]},proxy:true}])},[_v("dummy bug reports")])],1),_v(". The steps are similar to how you would enter bug reports in the GitHub issue tracker. Include at least one screenshot in one of those bug reports."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" you can "),_c('mark',[_v("copy-paste screenshots")]),_v(" into the bug description."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use Markdown syntax in the bug descriptions."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type")]),_v(" labels are compulsory.")]),_v(" "),_c('li',[_c('strong',[_v("Report any problems you encounter")]),_v(" at the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Do NOT delete the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")]),_v(" repo")]),_v(" created by CATcher in your GitHub account (keep it until the end of the semester) as our scripts will look for it later to check if you have done this activity.")])])]),_v(" "),_c('p')],1),_v(" "),_m(26)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-start-updating-uml-diagrams-in-the-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(27),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-start-updating-uml-diagrams-in-the-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("This is a good time to get familiar with the diagramming tools used by the tP.")])]),_v(" "),_m(28),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"light","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('div',{staticClass:"card-title"},[_c('p',[_c('span',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Deliverables → DG → Tips")])])])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)])]),_v(" "),_c('p')],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Why not wait till the end to add/update the DG diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Here are some reasons:")]),_v(" "),_c('ul',[_c('li',[_v("We want you to take at least two passes at documenting the project so that you can learn how to evolve the documentation along with the code "),_c('span',{staticClass:"dimmed"},[_v("(which requires additional considerations, when compared to documenting the project only once)")]),_v(".")]),_v(" "),_c('li',[_v("It is better to get used to the documentation tool chain early, to avoid unexpected problems near the final submission deadline.")]),_v(" "),_c('li',[_v("It allows receiving early self/peer/instructor feedback.")])])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_m(29)])]),_v(" "),_c('br'),_v(" "),_m(30)])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-week-10-alpha-version-v1-4"}},[_v("tP Week 10: Alpha version → v1.4 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-10"}},[_v("Intro to tP Week 10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_v("1 Do a postmortem of the previous iteration before the tutorial‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-plan-the-alpha-version-v1-4"}},[_v("2 Plan the alpha version (v1.4)‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_v("3 Deliver the alpha version (v1.4) Thu, Oct 24th 23:59‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_v("4 Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00 counted for participation‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-start-updating-uml-diagrams-in-the-dg"}},[_v("5 Start updating UML diagrams in the DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#end-of-tp-week-10"}},[_v("End of tP Week 10‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(31)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -98,6 +98,6 @@ with(this){return _c('div',[_c('div',{staticClass:"border border-success pt-2 ps with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w9.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 9: MVP → v1.3")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w11.html"}},[_c('span',[_v("tP Week 11: Release candidate → v1.5 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w11.html b/admin/tp-w11.html index 1e35e5cee0..f3616b6bb5 100644 --- a/admin/tp-w11.html +++ b/admin/tp-w11.html @@ -34,7 +34,7 @@
    • Remove mentions of any features not implemented yet, if any. As you are not allowed to change features during the iteration v1.6, there is no point keeping those in the UG.
      Alternatively, clearly indicate which features are not implemented yet e.g. tag those features with a Coming soon.
    • For those features already implemented, ensure their descriptions match the exact behavior of the product e.g. replace mockups with actual screenshots

    • Save the UG as a PDF file using this technique exactly. You'll need this file later when you create a product release. There is no specific file name convention for this version of the UG, but do use a reasonable file name: e.g., Contacts-Pro-User-Guide.pdf.

    • Similarly, update the Developer Guide (DG), and save it as PDF file.

    • Update the landing page (docs/index.md): Update to look like a real product (rather than a project for learning SE) if you haven't done so already. In particular, update the Ui.png to match the current product ( tips).

    4 Release v1.5 Thu, Nov 7th 23:59

    • Do a as described in the Developer Guide. Do the release by the given deadline.
      Do a smoke-test to ensure the jar file works (if the released jar file is broken, it will be omitted from the PE-D).
      • Include the following files in the release (as separate assets):
        1. JAR file
        2. UG (PDF file) -- uploaded as an 'asset' (similar to the JAR file), not embedded in the release note.
        3. DG (PDF file) -- similar to the UG
      • You may choose any suitable filename, but recommended not to have spaces or special characters in the JAR file name.
      • It is optional to write detailed release notes for this version.
    • You can do an additional release before the PE dry run (PE-D) if you wish, as long as you do it before 10 am Friday. That additional release is still considered part of v1.5 and therefore, not subjected to the feature freeze. When doing this additional release, do not delete the previous release (reason: it is good to preserver the release history) -- testers are expected to test the latest release file anyway. You may use any suitable version number for this JAR file e.g., v1.5.1.
      -Waiting till Friday 10am to release the v1.5 is strongly discouraged because if you miss that deadline, your team will not be able to benefit from the PE-D at all. It is better to have an earlier release to fall back on in case that happens.
    • The feature freeze will apply at the point you released the JAR file that was used in the PE-D i.e., the features submitted in the final v1.6 later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.
    • As before, wrap up the milestone (i.e., reschedule/close any remaining issues/PRs and close the milestone).


    tP Week 10: Alpha version → v1.4tP Week 12: Extra week for v1.5

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Waiting till Friday 10am to release the v1.5 is strongly discouraged because if you miss that deadline, your team will not be able to benefit from the PE-D at all. It is better to have an earlier release to fall back on in case that happens.
  • The feature freeze will apply at the point you released the JAR file that was used in the PE-D i.e., the features submitted in the final v1.6 later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.
  • As before, wrap up the milestone (i.e., reschedule/close any remaining issues/PRs and close the milestone).

  • tP Week 10: Alpha version → v1.4tP Week 12: Extra week for v1.5

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w11.page-vue-render.js b/admin/tp-w11.page-vue-render.js index 28929b6109..dbb674598d 100644 --- a/admin/tp-w11.page-vue-render.js +++ b/admin/tp-w11.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"font-weight-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Admin info")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseOverview.html"}},[_v("Course Overview")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('mark',[_v("Using this Website")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseExpectations.html"}},[_v("Course Expectations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Course Structure \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('small',[_v("Course Briefing Videos")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('small',[_v("Weekly Schedule")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/lectures.html"}},[_c('small',[_v("Weekly Briefings")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_c('small',[_v("Tutorials")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/instructors.html"}},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/textbooks.html"}},[_v("Textbooks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/programmingLanguages.html"}},[_v("Programming Language")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_v("Standards/Conventions")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Individual Project (iP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-overview.html"}},[_c('small',[_v("iP (Individual Project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w2.html"}},[_c('small',[_v("iP: Week 2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w3.html"}},[_c('small',[_v("iP: Week 3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w4.html"}},[_c('small',[_v("iP: Week 4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w5.html"}},[_c('small',[_v("iP: Week 5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w6.html"}},[_c('small',[_v("iP: Week 6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w7.html"}},[_c('small',[_v("iP: Week 7")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w8.html"}},[_c('small',[_v("iP: Week 8")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-grading.html"}},[_c('small',[_v("iP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Team Project (tP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-overview.html"}},[_c('small',[_v("tP (team project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('small',[_v("tP: Expectations")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('small',[_v("tP: Timeline")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('small',[_v("tP: Constraints")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-teams.html"}},[_c('small',[_v("tP: Forming Teams")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w3.html"}},[_c('small',[_v("tP Week 3: Kickoff")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w4.html"}},[_c('small',[_v("tP Week 4: Set direction")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w5.html"}},[_c('small',[_v("tP Week 5: Gather requirements")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w6.html"}},[_c('small',[_v("tP Week 6: Define the MVP")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w7.html"}},[_c('small',[_v("tP Week 7: Practice iteration → v1.1")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w8.html"}},[_c('small',[_v("tP Week 8: First feature increment → v1.2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w9.html"}},[_c('small',[_v("tP Week 9: MVP → v1.3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w10.html"}},[_c('small',[_v("tP Week 10: Alpha version → v1.4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w11.html"}},[_c('small',[_v("tP Week 11: Release candidate → v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w12.html"}},[_c('small',[_v("tP Week 12: Extra week for v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w13.html"}},[_c('small',[_v("tP Week 13: Public release → v1.6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('small',[_v("tP: Deliverables")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-ped.html"}},[_c('small',[_v("tP: Practical Exam Dry Run")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-pe.html"}},[_c('small',[_v("tP: Practical Exam")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('small',[_v("tP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('small',[_v("tP: Supervision/Guidance")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/peerEvaluations.html"}},[_v("Peer Evaluations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tools.html"}},[_v("Tools")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/exams.html"}},[_v("Exams")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/participation.html"}},[_v("Participation Marks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_v("Grade Breakdown")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Appendices \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('small',[_v("Apdx A: Course Principles")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('small',[_v("Apdx B: Course Policies")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('small',[_v("Apdx C: FAQ")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('small',[_v("Apdx D: Getting Help")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('small',[_v("Apdx E: Using GitHub")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('small',[_v("Apdx F: Handling Team Issues")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])])])])])],1)],1)])]),_v(" "),_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('br'),_v(" "),_m(1),_v(" "),_c('div',{attrs:{"id":"main"}},[_m(2),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(3),_v(" "),_m(4),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"60%","y":"80%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.5")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to apply internal quality control.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the "),_c('em',[_v("release candidate (RC)")]),_v(" version, ready for a public beta testing (i.e., the product quality should be sufficiently high "),_c('span',{staticClass:"dimmed"},[_v("e.g., no obvious bugs")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Do an "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("A full-product testing conducted by internal testers (in this case, project members themselves) acting as target users")]},proxy:true}])},[_v("alpha test")]),_v(" internally, and refine features as necessary. Improve tests, documentation, code quality.")],1)])])])]),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_c('div',[_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("This iteration is normally done in one week, but is spread over two weeks")]),_v(" due to clashes with holidays. So, do the amount of work you would normally do if this was only one week long (i.e., no need to do more work because there is an extra week for this iteration).")]),_v(" "),_c('p',[_c('strong',[_v("The "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html"}},[_v("tP progress dashboard")]),_v(" will stay in Week 11 for an extra week")]),_v(" (i.e., even when we are in Week 12), to reflect that you can use Week 12 to do Week 11 tP tasks "),_c('span',{staticClass:"dimmed"},[_v("i.e., pending Week 11 tasks will not turn red until end of week 12")]),_v(".")])])],1),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of the project grading criteria")]),_v(":")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","popup-url":"tp-grading.html","collapsed":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("tP → Grading")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Note that project grading is "),_c('mark',[_v("not competitive (not bell curved)")]),_v("."),_c('span',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_v("\nCS2103T projects will be assessed separately from CS2103 projects.")]),_v(" Given below is the marking scheme.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Total")])]),_v(": 50 marks ("),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 45 individual marks + "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 team marks)")]),_v(" "),_c('p',[_v("See the sections below for details of how we assess each aspect.")]),_v(" "),_c('div',{attrs:{"id":"criteria-productDesign"}},[_c('h4',{attrs:{"id":"1-project-grading-product-design-5-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("1. Project Grading: Product Design "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-project-grading-product-design-5-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")])]),_v(" "),_c('ul',[_c('li',[_v("how well your features "),_c('em',[_v("fit together")]),_v(" to form a cohesive product"),_c('br'),_v("\n(not how many features or how big/novel/interesting/difficult the features are)")]),_v(" "),_c('li',[_v("how well it "),_c('em',[_v("matches the target user")])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluated by:")])]),_v(" "),_c('ul',[_c('li',[_v("the teaching team (based on product demo and user guide)")]),_v(" "),_c('li',[_v("peers from other teams (based on peer testing and user guide)")])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Product Design")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])])]),_v(" "),_c('p'),_v(" "),_c('p',[_v("In addition, feature flaws reported in the PE will be considered when grading this aspect.")]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1)]),_v(" "),_c('div',{attrs:{"id":"grading-implementation"}},[_c('h4',{attrs:{"id":"2-project-grading-implementation-15-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("2. Project Grading: Implementation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 15 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-project-grading-implementation-15-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2A. Code quality")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" the quality of the parts of the code you claim as written by you")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")]),_v(" manual inspection by tutors + automated-analysis by a script")]),_v(" "),_c('p',[_c('strong',[_v("Criteria:")])]),_v(" "),_c('span',{attrs:{"id":"projectGrading-codeQuality-criteria"}},[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2B. Effort")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" how much value you contributed to the product")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_v("Step 1: Evaluate the effort for the entire project. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Questions used for Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the product implementation (excluding UG, DG, and team-based tasks) is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Baseline: If your team received a value higher than "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(" in step 1 and the team agrees that you did roughly an equal share of implementation work, you should receive full marks for effort.")])])])]),_v(" "),_c('h4',{attrs:{"id":"3-project-grading-qa-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("3. Project Grading: QA "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-project-grading-qa-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('big',[_c('strong',[_v("3A. Developer Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you tested your own feature")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")])]),_v(" "),_c('ol',[_c('li',[_v("functionality bugs in your work found by others during the "),_c('a',{attrs:{"href":"/website/admin/tp-pe.html#tp-practical-exam"}},[_v("Practical Exam (PE)")])]),_v(" "),_c('li',[_v("your test code "),_c('span',{staticClass:"dimmed"},[_v("(note "),_c('trigger',{attrs:{"trigger":"click","for":"modal:projectGradingQA-testingExpectations"}},[_v("our expectations for automated testing")]),_v(")")],1)])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:projectGradingQA-testingExpectations"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Our expectations for automated testing in the project")]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("3B. System/Acceptance Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you can system-test/acceptance-test a product")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" bugs you found in the PE. In addition to functionality bugs, you get credit for reporting documentation bugs and feature flaws.")]),_v(" "),_c('box',[_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_v(" "),_c('div',{attrs:{"id":"criteria-documentation"}},[_c('h4',{attrs:{"id":"4-project-grading-documentation-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("4. Project Grading: Documentation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-project-grading-documentation-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluates:")]),_v(" your contribution to project documents")]),_v(" "),_c('p',[_c('strong',[_v("Method:")]),_v(" Evaluated in two steps.")]),_v(" "),_c('ul',[_c('li',[_v("Step 1: Evaluate the whole UG and DG. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the UG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the User Guide is,")])],1),_v(" "),_c('span',{attrs:{"id":"equalShareScale"}},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the DG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the Developer Guide is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("In addition, UG and DG bugs you received in the PE will be considered for grading this component.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1)])]),_v(" "),_c('h4',{attrs:{"id":"5-project-grading-project-management-5-5-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("5. Project Grading: Project Management "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 + "),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 = 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-project-grading-project-management-5-5-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"project-management-grading"}},[_c('p',[_c('big',[_c('strong',[_v("5A. Process:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you did in project management related aspects of the project, as an individual and as a team")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" tutor/grading-script observations of project milestones and GitHub data")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Project done iteratively and incrementally "),_c('span',{staticClass:"dimmed"},[_v("(opposite: doing most of the work in one big burst)")])])]),_v(" "),_c('li',[_c('p',[_v("Project tasks done on time (to get a good grade for this aspect, finish at least 75% of the tasks by the deadline).")])]),_v(" "),_c('li',[_c('p',[_v("Good use of these GitHub mechanisms:")]),_v(" "),_c('ul',[_c('li',[_v("milestones")]),_v(" "),_c('li',[_v("releases")]),_v(" "),_c('li',[_v("issue tracker (with good task definition, assignment, and tracking)")]),_v(" "),_c('li',[_v("PRs, and PR reviews")])])]),_v(" "),_c('li',[_c('p',[_v("Good version control, based on the repo.")])]),_v(" "),_c('li',[_c('p',[_v("Reasonable attempt to use the prescribed workflows.")])]),_v(" "),_c('li',[_c('p',[_v("Good use of buffers "),_c('span',{staticClass:"dimmed"},[_v("(opposite: everything at the last minute)")]),_v(".")])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("5B. Team-tasks:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How much you contributed to team-tasks")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Expectations: Examples of team-tasks "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" peer evaluations, tutor observations")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")]),_v(" Do the following to get a good grade for this aspect:")]),_v(" "),_c('ul',[_c('li',[_v("Do close to an equal share of the team tasks.")]),_v(" "),_c('li',[_v("Have commits in four of weeks 7, 8, 9, 10, 11, 12")])])])])])],1)],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-alpha-test-the-product"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(7),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-alpha-test-the-product","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(8),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding",attrs:{"type":"","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam (Extract) → "),_c('strong',[_v("Steps for testing a tP JAR file")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])])])],1),_c('p'),_v(" "),_c('ol',{attrs:{"start":"4"}},[_c('li',[_c('strong',[_v("Report bugs")]),_v(" you found, and "),_c('mark',[_v("even suggestions for improvements")]),_v(".\n"),_c('ul',[_c('li',[_v("If in doubt, report anyway.")]),_v(" "),_m(9),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" For this individual tP tasks to be marked as done, you need to submit at least 5 issues labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("alpha-bug")]),_v(".")])])])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("If you want to smoke-test your JAR file on an OS not available within your team, you can post a request in the forum to see if anyone else in the class can help you smoke-test it on that OS.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("The panel below contains guidelines your peers will use when determining bugs in the final product -- knowing them might be useful in preventing such bugs in your product in the first place. You may skip the 'General' section.")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam → "),_c('strong',[_v("Guidelines for determining bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_c('p')]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Some testing tips to get you started (not an exhaustive list)...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("If your app references date/time of the computer it is running on (e.g., to calculate time elapsed), test if it can work if the computer date/time is configured to be in different formats -- different computers might use different date formats.")]),_v(" "),_c('li',[_v("Test against all typical user mistakes "),_c('span',{staticClass:"dimmed"},[_v("e.g., typing two spaces instead of one")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-fix-alpha-test-bugs-fine-tune-features"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(10),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-fix-alpha-test-bugs-fine-tune-features","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(11),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Consider increasing test coverage")]),_v(" by adding more tests if it is lower than the level you would like it to be. Take note of our expectation on test code (given in the panel below).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("After you have sufficient code coverage, fix remaining code quality problems")]),_v(" and bring up the quality to your target level. Note that the quality of the code attributed to you accounts for a significant component of your final score, graded individually (based on the code attributed to you by the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP code dashboard")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Code Quality Tips")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])])])],1),_c('p')])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Must we fix all bugs reported and all enhancements suggested by testers?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not necessarily. Choose based on importance.")]),_v(" "),_c('p',[_v("In any project, there are always things that can be done 'if there was more time'. If fixing a certain bug has low impact on users, and fixing it is not as important as the work done (or intend to do in the current iteration), you can justify not fixing it with the reason 'not in scope' of the current iteration.")]),_v(" "),_c('p',[_v("Similarly, a missing feature enhancement can be justified as 'not in scope' if implementing that could have taken resources away from other important project tasks.")]),_v(" "),_c('p',[_v("Bugs and possible enhancements 'not in scope' will not be penalized.")])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-update-ug-and-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(12),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-update-ug-and-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Update the User Guide")]),_v(" to match the current version of the product. "),_c('span',{staticClass:"dimmed"},[_v("Reason: testers will need to refer to the UG during the practical exam dry run")]),_v(".\n"),_m(13)])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(14),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("Caution on PDF conversions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-PDF-Friendly")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-pdf-friendly"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-PDF-Friendly")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-pdf-friendly","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The DG and UG should be PDF-friendly. Don't use expandable panels, embedded videos, animated GIFs etc. "),_c('br')]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" The UG and DG used in the final grading will be in PDF format")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-File-Size")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p'),_v(" "),_m(15),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_m(16),_v(": Update to look like a real product (rather than a project for learning SE) if you haven't done so already. In particular, "),_c('mark',[_v("update the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" to match the current product ("),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-tipsForProductScreenshot"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" tips")]),_v(")")],1),_v(".")])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-tipsForProductScreenshot"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin → Project Deliverables → Website -> Tips for Product Screenshots")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-release-v1-5-thu-nov-7th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(17),_v(" "),_m(18),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-release-v1-5-thu-nov-7th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Do a "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("resulting in a jar file on GitHub that can be downloaded by potential users")]},proxy:true}])},[_v("proper product release")])],1),_v(" "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp/DevOps.html#making-a-release"}},[_v("as described in the Developer Guide")]),_v(". Do the release by the given deadline. "),_c('br'),_v(" "),_c('mark',[_v("Do a smoke-test to ensure the jar file works")]),_v(" (if the released jar file is broken, it will be omitted from the PE-D)."),_c('br'),_v(" "),_m(19)]),_v(" "),_m(20),_v(" "),_c('li',[_c('strong',[_v("The "),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-jar-desc"}},[_c('em',[_v("feature freeze")])]),_v(" will apply at the point you released the JAR file that was used in the PE-D")],1),_v(" i.e., the features submitted in the final "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.6")]),_v(" later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.")]),_v(" "),_m(21)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-jar-desc"},scopedSlots:_u([{key:"header",fn:function(){return undefined},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)])],1),_v(" "),_c('p'),_v(" "),_c('div')])]),_v(" "),_c('br'),_v(" "),_m(22)])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-week-11-release-candidate-v1-5"}},[_v("tP Week 11: Release candidate → v1.5 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-11"}},[_v("Intro to tP Week 11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-alpha-test-the-product"}},[_v("1 Alpha-test the product‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-fix-alpha-test-bugs-fine-tune-features"}},[_v("2 Fix alpha-test bugs, fine-tune features‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-update-ug-and-dg"}},[_v("3 Update UG and DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-release-v1-5-thu-nov-7th-23-59"}},[_v("4 Release v1.5 Thu, Nov 7th 23:59‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(23)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"font-weight-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Admin info")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseOverview.html"}},[_v("Course Overview")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('mark',[_v("Using this Website")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseExpectations.html"}},[_v("Course Expectations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Course Structure \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('small',[_v("Course Briefing Videos")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('small',[_v("Weekly Schedule")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/lectures.html"}},[_c('small',[_v("Weekly Briefings")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_c('small',[_v("Tutorials")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/instructors.html"}},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/textbooks.html"}},[_v("Textbooks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/programmingLanguages.html"}},[_v("Programming Language")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_v("Standards/Conventions")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Individual Project (iP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-overview.html"}},[_c('small',[_v("iP (Individual Project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w2.html"}},[_c('small',[_v("iP: Week 2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w3.html"}},[_c('small',[_v("iP: Week 3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w4.html"}},[_c('small',[_v("iP: Week 4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w5.html"}},[_c('small',[_v("iP: Week 5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w6.html"}},[_c('small',[_v("iP: Week 6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w7.html"}},[_c('small',[_v("iP: Week 7")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w8.html"}},[_c('small',[_v("iP: Week 8")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-grading.html"}},[_c('small',[_v("iP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Team Project (tP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-overview.html"}},[_c('small',[_v("tP (team project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('small',[_v("tP: Expectations")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('small',[_v("tP: Timeline")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('small',[_v("tP: Constraints")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-teams.html"}},[_c('small',[_v("tP: Forming Teams")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w3.html"}},[_c('small',[_v("tP Week 3: Kickoff")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w4.html"}},[_c('small',[_v("tP Week 4: Set direction")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w5.html"}},[_c('small',[_v("tP Week 5: Gather requirements")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w6.html"}},[_c('small',[_v("tP Week 6: Define the MVP")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w7.html"}},[_c('small',[_v("tP Week 7: Practice iteration → v1.1")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w8.html"}},[_c('small',[_v("tP Week 8: First feature increment → v1.2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w9.html"}},[_c('small',[_v("tP Week 9: MVP → v1.3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w10.html"}},[_c('small',[_v("tP Week 10: Alpha version → v1.4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w11.html"}},[_c('small',[_v("tP Week 11: Release candidate → v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w12.html"}},[_c('small',[_v("tP Week 12: Extra week for v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w13.html"}},[_c('small',[_v("tP Week 13: Public release → v1.6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('small',[_v("tP: Deliverables")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-ped.html"}},[_c('small',[_v("tP: Practical Exam Dry Run")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-pe.html"}},[_c('small',[_v("tP: Practical Exam")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('small',[_v("tP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('small',[_v("tP: Supervision/Guidance")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/peerEvaluations.html"}},[_v("Peer Evaluations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tools.html"}},[_v("Tools")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/exams.html"}},[_v("Exams")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/participation.html"}},[_v("Participation Marks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_v("Grade Breakdown")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Appendices \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('small',[_v("Apdx A: Course Principles")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('small',[_v("Apdx B: Course Policies")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('small',[_v("Apdx C: FAQ")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('small',[_v("Apdx D: Getting Help")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('small',[_v("Apdx E: Using GitHub")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('small',[_v("Apdx F: Handling Team Issues")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])])])])])],1)],1)])]),_v(" "),_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('br'),_v(" "),_m(1),_v(" "),_c('div',{attrs:{"id":"main"}},[_m(2),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(3),_v(" "),_m(4),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"60%","y":"80%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.5")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to apply internal quality control.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the "),_c('em',[_v("release candidate (RC)")]),_v(" version, ready for a public beta testing (i.e., the product quality should be sufficiently high "),_c('span',{staticClass:"dimmed"},[_v("e.g., no obvious bugs")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Do an "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("A full-product testing conducted by internal testers (in this case, project members themselves) acting as target users")]},proxy:true}])},[_v("alpha test")]),_v(" internally, and refine features as necessary. Improve tests, documentation, code quality.")],1)])])])]),_v(" "),_m(5),_v(" "),_m(6),_v(" "),_c('div',[_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("This iteration is normally done in one week, but is spread over two weeks")]),_v(" due to clashes with holidays. So, do the amount of work you would normally do if this was only one week long (i.e., no need to do more work because there is an extra week for this iteration).")]),_v(" "),_c('p',[_c('strong',[_v("The "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html"}},[_v("tP progress dashboard")]),_v(" will stay in Week 11 for an extra week")]),_v(" (i.e., even when we are in Week 12), to reflect that you can use Week 12 to do Week 11 tP tasks "),_c('span',{staticClass:"dimmed"},[_v("i.e., pending Week 11 tasks will not turn red until end of week 12")]),_v(".")])])],1),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of the project grading criteria")]),_v(":")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","popup-url":"tp-grading.html","collapsed":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("tP → Grading")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Note that project grading is "),_c('mark',[_v("not competitive (not bell curved)")]),_v("."),_c('span',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_v("\nCS2103T projects will be assessed separately from CS2103 projects.")]),_v(" Given below is the marking scheme.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Total")])]),_v(": 50 marks ("),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 45 individual marks + "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 team marks)")]),_v(" "),_c('p',[_v("See the sections below for details of how we assess each aspect.")]),_v(" "),_c('div',{attrs:{"id":"criteria-productDesign"}},[_c('h4',{attrs:{"id":"1-project-grading-product-design-5-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("1. Project Grading: Product Design "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-project-grading-product-design-5-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")])]),_v(" "),_c('ul',[_c('li',[_v("how well your features "),_c('em',[_v("fit together")]),_v(" to form a cohesive product"),_c('br'),_v("\n(not how many features or how big/novel/interesting/difficult the features are)")]),_v(" "),_c('li',[_v("how well it "),_c('em',[_v("matches the target user")])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluated by:")])]),_v(" "),_c('ul',[_c('li',[_v("the teaching team (based on product demo and user guide)")]),_v(" "),_c('li',[_v("peers from other teams (based on peer testing and user guide)")])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Product Design")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])])]),_v(" "),_c('p'),_v(" "),_c('p',[_v("In addition, feature flaws reported in the PE will be considered when grading this aspect.")]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1)]),_v(" "),_c('div',{attrs:{"id":"grading-implementation"}},[_c('h4',{attrs:{"id":"2-project-grading-implementation-15-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("2. Project Grading: Implementation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 15 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-project-grading-implementation-15-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2A. Code quality")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" the quality of the parts of the code you claim as written by you")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")]),_v(" manual inspection by tutors + automated-analysis by a script")]),_v(" "),_c('p',[_c('strong',[_v("Criteria:")])]),_v(" "),_c('span',{attrs:{"id":"projectGrading-codeQuality-criteria"}},[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2B. Effort")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" how much value you contributed to the product")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_v("Step 1: Evaluate the effort for the entire project. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Questions used for Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the product implementation (excluding UG, DG, and team-based tasks) is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Baseline: If your team received a value higher than "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(" in step 1 and the team agrees that you did roughly an equal share of implementation work, you should receive full marks for effort.")])])])]),_v(" "),_c('h4',{attrs:{"id":"3-project-grading-qa-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("3. Project Grading: QA "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-project-grading-qa-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('big',[_c('strong',[_v("3A. Developer Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you tested your own feature")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")])]),_v(" "),_c('ol',[_c('li',[_v("functionality bugs in your work found by others during the "),_c('a',{attrs:{"href":"/website/admin/tp-pe.html#tp-practical-exam"}},[_v("Practical Exam (PE)")])]),_v(" "),_c('li',[_v("your test code "),_c('span',{staticClass:"dimmed"},[_v("(note "),_c('trigger',{attrs:{"trigger":"click","for":"modal:projectGradingQA-testingExpectations"}},[_v("our expectations for automated testing")]),_v(")")],1)])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:projectGradingQA-testingExpectations"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Our expectations for automated testing in the project")]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("3B. System/Acceptance Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you can system-test/acceptance-test a product")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" bugs you found in the PE. In addition to functionality bugs, you get credit for reporting documentation bugs and feature flaws.")]),_v(" "),_c('box',[_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_v(" "),_c('div',{attrs:{"id":"criteria-documentation"}},[_c('h4',{attrs:{"id":"4-project-grading-documentation-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("4. Project Grading: Documentation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-project-grading-documentation-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluates:")]),_v(" your contribution to project documents")]),_v(" "),_c('p',[_c('strong',[_v("Method:")]),_v(" Evaluated in two steps.")]),_v(" "),_c('ul',[_c('li',[_v("Step 1: Evaluate the whole UG and DG. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the UG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the User Guide is,")])],1),_v(" "),_c('span',{attrs:{"id":"equalShareScale"}},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the DG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the Developer Guide is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("In addition, UG and DG bugs you received in the PE will be considered for grading this component.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1)])]),_v(" "),_c('h4',{attrs:{"id":"5-project-grading-project-management-5-5-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("5. Project Grading: Project Management "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 + "),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 = 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-project-grading-project-management-5-5-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"project-management-grading"}},[_c('p',[_c('big',[_c('strong',[_v("5A. Process:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you did in project management related aspects of the project, as an individual and as a team")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" tutor/grading-script observations of project milestones and GitHub data")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Project done iteratively and incrementally "),_c('span',{staticClass:"dimmed"},[_v("(opposite: doing most of the work in one big burst)")])])]),_v(" "),_c('li',[_c('p',[_v("Project tasks done on time (to get a good grade for this aspect, finish at least 75% of the tasks by the deadline).")])]),_v(" "),_c('li',[_c('p',[_v("Good use of these GitHub mechanisms:")]),_v(" "),_c('ul',[_c('li',[_v("milestones")]),_v(" "),_c('li',[_v("releases")]),_v(" "),_c('li',[_v("issue tracker (with good task definition, assignment, and tracking)")]),_v(" "),_c('li',[_v("PRs, and PR reviews")])])]),_v(" "),_c('li',[_c('p',[_v("Good version control, based on the repo.")])]),_v(" "),_c('li',[_c('p',[_v("Reasonable attempt to use the prescribed workflows.")])]),_v(" "),_c('li',[_c('p',[_v("Good use of buffers "),_c('span',{staticClass:"dimmed"},[_v("(opposite: everything at the last minute)")]),_v(".")])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("5B. Team-tasks:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How much you contributed to team-tasks")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Expectations: Examples of team-tasks "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" peer evaluations, tutor observations")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")]),_v(" Do the following to get a good grade for this aspect:")]),_v(" "),_c('ul',[_c('li',[_v("Do close to an equal share of the team tasks.")]),_v(" "),_c('li',[_v("Have commits in four of weeks 7, 8, 9, 10, 11, 12")])])])])])],1)],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-alpha-test-the-product"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(7),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-alpha-test-the-product","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(8),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding",attrs:{"type":"","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam (Extract) → "),_c('strong',[_v("Steps for testing a tP JAR file")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])])])],1),_c('p'),_v(" "),_c('ol',{attrs:{"start":"4"}},[_c('li',[_c('strong',[_v("Report bugs")]),_v(" you found, and "),_c('mark',[_v("even suggestions for improvements")]),_v(".\n"),_c('ul',[_c('li',[_v("If in doubt, report anyway.")]),_v(" "),_m(9),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" For this individual tP tasks to be marked as done, you need to submit at least 5 issues labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("alpha-bug")]),_v(".")])])])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("If you want to smoke-test your JAR file on an OS not available within your team, you can post a request in the forum to see if anyone else in the class can help you smoke-test it on that OS.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("The panel below contains guidelines your peers will use when determining bugs in the final product -- knowing them might be useful in preventing such bugs in your product in the first place. You may skip the 'General' section.")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam → "),_c('strong',[_v("Guidelines for determining bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_c('p')]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Some testing tips to get you started (not an exhaustive list)...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("If your app references date/time of the computer it is running on (e.g., to calculate time elapsed), test if it can work if the computer date/time is configured to be in different formats -- different computers might use different date formats.")]),_v(" "),_c('li',[_v("Test against all typical user mistakes "),_c('span',{staticClass:"dimmed"},[_v("e.g., typing two spaces instead of one")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-fix-alpha-test-bugs-fine-tune-features"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(10),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-fix-alpha-test-bugs-fine-tune-features","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(11),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Consider increasing test coverage")]),_v(" by adding more tests if it is lower than the level you would like it to be. Take note of our expectation on test code (given in the panel below).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("After you have sufficient code coverage, fix remaining code quality problems")]),_v(" and bring up the quality to your target level. Note that the quality of the code attributed to you accounts for a significant component of your final score, graded individually (based on the code attributed to you by the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP code dashboard")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Code Quality Tips")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])])])],1),_c('p')])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Must we fix all bugs reported and all enhancements suggested by testers?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not necessarily. Choose based on importance.")]),_v(" "),_c('p',[_v("In any project, there are always things that can be done 'if there was more time'. If fixing a certain bug has low impact on users, and fixing it is not as important as the work done (or intend to do in the current iteration), you can justify not fixing it with the reason 'not in scope' of the current iteration.")]),_v(" "),_c('p',[_v("Similarly, a missing feature enhancement can be justified as 'not in scope' if implementing that could have taken resources away from other important project tasks.")]),_v(" "),_c('p',[_v("Bugs and possible enhancements 'not in scope' will not be penalized.")])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-update-ug-and-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(12),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-update-ug-and-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Update the User Guide")]),_v(" to match the current version of the product. "),_c('span',{staticClass:"dimmed"},[_v("Reason: testers will need to refer to the UG during the practical exam dry run")]),_v(".\n"),_m(13)])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(14),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("Caution on PDF conversions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-PDF-Friendly")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-pdf-friendly"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-PDF-Friendly")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-pdf-friendly","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The DG and UG should be PDF-friendly. Don't use expandable panels, embedded videos, animated GIFs etc. "),_c('br')]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" The UG and DG used in the final grading will be in PDF format")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-File-Size")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p'),_v(" "),_m(15),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_m(16),_v(": Update to look like a real product (rather than a project for learning SE) if you haven't done so already. In particular, "),_c('mark',[_v("update the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" to match the current product ("),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-tipsForProductScreenshot"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" tips")]),_v(")")],1),_v(".")])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-tipsForProductScreenshot"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin → Project Deliverables → Website -> Tips for Product Screenshots")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-release-v1-5-thu-nov-7th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(17),_v(" "),_m(18),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-release-v1-5-thu-nov-7th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Do a "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("resulting in a jar file on GitHub that can be downloaded by potential users")]},proxy:true}])},[_v("proper product release")])],1),_v(" "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp/DevOps.html#making-a-release"}},[_v("as described in the Developer Guide")]),_v(". Do the release by the given deadline. "),_c('br'),_v(" "),_c('mark',[_v("Do a smoke-test to ensure the jar file works")]),_v(" (if the released jar file is broken, it will be omitted from the PE-D)."),_c('br'),_v(" "),_m(19)]),_v(" "),_m(20),_v(" "),_c('li',[_c('strong',[_v("The "),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-jar-desc"}},[_c('em',[_v("feature freeze")])]),_v(" will apply at the point you released the JAR file that was used in the PE-D")],1),_v(" i.e., the features submitted in the final "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.6")]),_v(" later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.")]),_v(" "),_m(21)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-jar-desc"},scopedSlots:_u([{key:"header",fn:function(){return undefined},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)])],1),_v(" "),_c('p'),_v(" "),_c('div')])]),_v(" "),_c('br'),_v(" "),_m(22)])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-week-11-release-candidate-v1-5"}},[_v("tP Week 11: Release candidate → v1.5 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-11"}},[_v("Intro to tP Week 11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-alpha-test-the-product"}},[_v("1 Alpha-test the product‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-fix-alpha-test-bugs-fine-tune-features"}},[_v("2 Fix alpha-test bugs, fine-tune features‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-update-ug-and-dg"}},[_v("3 Update UG and DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-release-v1-5-thu-nov-7th-23-59"}},[_v("4 Release v1.5 Thu, Nov 7th 23:59‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(23)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -74,6 +74,6 @@ with(this){return _c('li',[_v("As before, wrap up the milestone "),_c('span',{st with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w10.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 10: Alpha version → v1.4")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w12.html"}},[_c('span',[_v("tP Week 12: Extra week for v1.5 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w12.html b/admin/tp-w12.html index 5f58e81659..f84c083fc1 100644 --- a/admin/tp-w12.html +++ b/admin/tp-w12.html @@ -21,7 +21,7 @@
  • tP Week 11: Release candidate → v1.5tP Week 13: Public release → v1.6


    tP Week 12: Extra week for v1.5

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    Intro to tP Week 12

    What's happening this week:

    We are still in iteration v1.5, due to this iteration being stretched over two weeks.

    1 Finish any remaining v1.5 tasks

    • Use this extra week to finish any leftover tasks from the previous week.

    2 Attend the practical exam dry run Fri, Nov 8th 1600-1800

    • The practical exam dry run (PE-D) will be held in the coming weekly briefing. It is graded. See the panel below for more info.


    tP Week 11: Release candidate → v1.5tP Week 13: Public release → v1.6

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    tP Week 11: Release candidate → v1.5tP Week 13: Public release → v1.6


    tP Week 12: Extra week for v1.5

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    Intro to tP Week 12

    What's happening this week:

    We are still in iteration v1.5, due to this iteration being stretched over two weeks.

    1 Finish any remaining v1.5 tasks

    • Use this extra week to finish any leftover tasks from the previous week.

    2 Attend the practical exam dry run Fri, Nov 8th 1600-1800

    • The practical exam dry run (PE-D) will be held in the coming weekly briefing. It is graded. See the panel below for more info.


    tP Week 11: Release candidate → v1.5tP Week 13: Public release → v1.6

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w12.page-vue-render.js b/admin/tp-w12.page-vue-render.js index 0095220bc1..5c7a7fec8f 100644 --- a/admin/tp-w12.page-vue-render.js +++ b/admin/tp-w12.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('ul',[_c('li',[_v("The practical exam dry run (PE-D) will b with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w11.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 11: Release candidate → v1.5")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w13.html"}},[_c('span',[_v("tP Week 13: Public release → v1.6 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w13.html b/admin/tp-w13.html index 8ae6b51ff4..03b5715ee2 100644 --- a/admin/tp-w13.html +++ b/admin/tp-w13.html @@ -22,7 +22,7 @@
  • tP Week 12: Extra week for v1.5tP: Deliverables


    tP Week 13: Public release → v1.6

    1. Fix PE-D bugs
    2. Submit final deliverables Tue, Nov 12th 14:00
    3. Prepare for the practical exam
    4. Ensure the code is RepoSense-compatible
    5. Attend the practical exam Fri, Nov 15th 1600-1800
    6. [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    Intro to tP Week 13

    What's happening this week:

    v1.6

    • Learning outcome: Able to put in final touches while minimizing delivery risks i.e., risks of regressions or deadline overruns.
    • Product goal: Reach the quality necessary for a public release.
    • Strategy: Freeze features. Strictly limit changes to bug fixes only.

    Things to note:

    Remind yourself of our policy on reuse (e.g., how to give credit for reused code):

    1 Fix PE-D bugs

    1. Triage bugs you received in the PE-D, by following the procedure given below:

    1. Note what is allowed in this milestone:

    The goal of freezing features in the pre-release iteration is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs.
    -In a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow any feature changes because it can start us on a slippery slope and many "is this change allowed?" queries. Therefore, v1.6 should not have any behaviors that were not already tested in the ). Hence, the feature freeze comes into effect at the point you released the JAR file that was used for the PE-D.

    While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and follow the spirit of the feature freeze (i.e., do not change features further; correct unintentional errors only).

    Allowed in the v1.6 milestone:

    • fixing bugs (but not feature flaws) -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.
    • improving documentation (e.g., update UG, DG, code comments)
    • improving code quality
    • improving the testing aspect (e.g., add more tests)
    • removing features (i.e., removing an entire feature or a part of a feature)

    Not allowed in v1.6:

    • adding/changing features (even minor behavior enhancements/tweaks)
    • any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)
    • updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)

    Using 'Planned Enhancements' DG section to counter known feature flaws: Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named Appendix: Planned Enhancements to the end of the DG. More details in the panel below:

    FAQs on what is allowed during the feature freeze:

    [Q0] What's the penalty for violating the feature freeze?


    [Q1] How to differentiate between bugs vs enhancements?


    [Q2] Will we be penalized for feature flaws not fixed during the feature freeze?


    [Q3] What if an issue is related to a behavior not specifically stated in the UG?


    [Q4] What if a feature is mentioned in the UG but not available fully in the product?


    [Q5] Can we tweak validity checks for a user input, or error/exception handling?


    [Q6] Can we tweak UI text (i.e., error/help messages or other text shown to the user)?


    [Q7] Can we tweak case-sensitivity of a feature?


    [Q8] A UI text gets truncated (or overflows) for certain inputs (or certain Windows sizes); can we fix them?


    [Q9] Can we tweak the command format?


    [Q10] What if the UI is inconsistent with the data?


    [Q11] The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?


    [Q12] We already merged a PR that violates the feature freeze. Now what?


    [Q13] How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?


    [Q14] What if the same bug is reported in the PE?


    1. Fix bugs that you deem as important enough to be fixed in v1.6. Also keep in mind that bug fixing can cause regressions which you'll have to catch and fix.

    2. Submit peer evaluations for PE-D testers: Submit your peer-evaluation of PE-D testers to indicate how well they helped your team.
      +In a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow any feature changes because it can start us on a slippery slope and many "is this change allowed?" queries. Therefore, v1.6 should not have any behaviors that were not already tested in the ). Hence, the feature freeze comes into effect at the point you released the JAR file that was used for the PE-D.

      While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and follow the spirit of the feature freeze (i.e., do not change features further; correct unintentional errors only).

      Allowed in the v1.6 milestone:

      • fixing bugs (but not feature flaws) -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.
      • improving documentation (e.g., update UG, DG, code comments)
      • improving code quality
      • improving the testing aspect (e.g., add more tests)
      • removing features (i.e., removing an entire feature or a part of a feature)

      Not allowed in v1.6:

      • adding/changing features (even minor behavior enhancements/tweaks)
      • any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)
      • updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)

      Using 'Planned Enhancements' DG section to counter known feature flaws: Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named Appendix: Planned Enhancements to the end of the DG. More details in the panel below:

      FAQs on what is allowed during the feature freeze:

      [Q0] What's the penalty for violating the feature freeze?


      [Q1] How to differentiate between bugs vs enhancements?


      [Q2] Will we be penalized for feature flaws not fixed during the feature freeze?


      [Q3] What if an issue is related to a behavior not specifically stated in the UG?


      [Q4] What if a feature is mentioned in the UG but not available fully in the product?


      [Q5] Can we tweak validity checks for a user input, or error/exception handling?


      [Q6] Can we tweak UI text (i.e., error/help messages or other text shown to the user)?


      [Q7] Can we tweak case-sensitivity of a feature?


      [Q8] A UI text gets truncated (or overflows) for certain inputs (or certain Windows sizes); can we fix them?


      [Q9] Can we tweak the command format?


      [Q10] What if the UI is inconsistent with the data?


      [Q11] The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?


      [Q12] We already merged a PR that violates the feature freeze. Now what?


      [Q13] How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?


      [Q14] What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?


    1. Fix bugs that you deem as important enough to be fixed in v1.6. Also keep in mind that bug fixing can cause regressions which you'll have to catch and fix.

    2. Submit peer evaluations for PE-D testers: Submit your peer-evaluation of PE-D testers to indicate how well they helped your team.
      Deadline: by Wed, Nov 13th 2359
      The submission is to be done via the TEAMMATES system.
      Only one team member needs to submit on behalf of the team but discuss among team members first.
      @@ -43,7 +43,7 @@

      • Convert to pdf and upload to Canvas.
      • File name: [TEAM_ID][ProductName]UG.pdf e.g.[CS2103-T09-2][ContactsPlus]UG.pdf
      • Developer Guide:
        • submission is similar to the UG
        • File name: [TEAM_ID][ProductName]DG.pdf e.g. [CS2103-T09-2][ContactsPlus]DG.pdf

      • [Optional] Project Portfolio Page (PPP):
        • HTML version: make available on github.io
        • See the panel below to learn when you should opt for this submission.

      Admin tP → Deliverables → Project Portfolio Page

      At the end of the project each student is required to submit a Project Portfolio Page. To reduce workload, this deliverable has been made optional this semester. You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.

      Details ... (read only if you opted to submit this deliverable)

      PPP Objectives

      • For you to use (e.g. in your resume) as a well-documented data point of your SE experience
      • For evaluators to use as a data point for evaluating your project contributions

      PPP Sections to include

      • Overview: A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.
      • Summary of Contributions --Suggested items to include: -
        • Code contributed: Give a link to your code on tP Code Dashboard. The link is available in the Project List Page -- linked to the icon under your profile picture.
        • Enhancements implemented: A summary of the enhancements you implemented.
        • Contributions to the UG: Which sections did you contribute to the UG?
        • Contributions to the DG: Which sections did you contribute to the DG? Which UML diagrams did you add/updated?
        • Contributions to team-based tasks
        • Review/mentoring contributions: Links to PRs reviewed, instances of helping team members in other ways.
        • Contributions beyond the project team:
          • Evidence of helping others e.g. responses you posted in our forum, bugs you reported in other team's products,
          • Evidence of technical leadership e.g. sharing useful information in the forum

      Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score e.g., explain how deep the enhancement is, why it is complete, how hard it was to implement etc.

      • OPTIONAL Contributions to the Developer Guide (Extracts): Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.
      • OPTIONAL Contributions to the User Guide (Extracts): Reproduce the parts in the User Guide that you wrote.

      PPP Format

      • File name (i.e., in the repo): docs/team/github_username_in_lower_case.md e.g., docs/team/goodcoder123.md
      • Follow the example in the AddressBook-Level3
      • PDF file submission: not required.


      • Product Website: Update website (home page,Ui.png, AboutUs.md etc.) on GitHub. Ensure the website is auto-published.

      3 Prepare for the practical exam

      • After reading the above 2, we strongly recommend you read ahead the info given in the item 6 below as well, to know in advance what will happen during the PE itself.

      4 Ensure the code is RepoSense-compatible

      • Ensure your code is and the code it attributes to you is indeed the code written by you, as explained below:

        • Go to the tp Code Dashboard. Click on the </> icon against your name and verify that the lines attributed to you (i.e., lines marked as green) reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines.

        • More info on how to make the code RepoSense compatible:

      FAQ What if someone took over a feature from another team member?


      5 Attend the practical exam Fri, Nov 15th 1600-1800

      • Ensure you read the instructions on PE Preparation (given in item 5 above)
      • Attend the practical test, to be done during the weekly briefing.

      6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

      • In the very unlikely event that the PE had to be cancelled due to technical issues, attend the makeup PE on this day.
      • Note: This is not an alternative option for students who could not attend the PE, as all students need to do the PE at the same time.


      tP Week 12: Extra week for v1.5tP: Deliverables

      [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
      +
      • Code contributed: Give a link to your code on tP Code Dashboard. The link is available in the Project List Page -- linked to the icon under your profile picture.
      • Enhancements implemented: A summary of the enhancements you implemented.
      • Contributions to the UG: Which sections did you contribute to the UG?
      • Contributions to the DG: Which sections did you contribute to the DG? Which UML diagrams did you add/updated?
      • Contributions to team-based tasks
      • Review/mentoring contributions: Links to PRs reviewed, instances of helping team members in other ways.
      • Contributions beyond the project team:
        • Evidence of helping others e.g. responses you posted in our forum, bugs you reported in other team's products,
        • Evidence of technical leadership e.g. sharing useful information in the forum

      Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score e.g., explain how deep the enhancement is, why it is complete, how hard it was to implement etc.

      • OPTIONAL Contributions to the Developer Guide (Extracts): Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.
      • OPTIONAL Contributions to the User Guide (Extracts): Reproduce the parts in the User Guide that you wrote.

      PPP Format

      • File name (i.e., in the repo): docs/team/github_username_in_lower_case.md e.g., docs/team/goodcoder123.md
      • Follow the example in the AddressBook-Level3
      • PDF file submission: not required.


      • Product Website: Update website (home page,Ui.png, AboutUs.md etc.) on GitHub. Ensure the website is auto-published.

      3 Prepare for the practical exam

      • After reading the above 2, we strongly recommend you read ahead the info given in the item 6 below as well, to know in advance what will happen during the PE itself.

      4 Ensure the code is RepoSense-compatible

      • Ensure your code is and the code it attributes to you is indeed the code written by you, as explained below:

        • Go to the tp Code Dashboard. Click on the </> icon against your name and verify that the lines attributed to you (i.e., lines marked as green) reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines.

        • More info on how to make the code RepoSense compatible:

      FAQ What if someone took over a feature from another team member?


      5 Attend the practical exam Fri, Nov 15th 1600-1800

      • Ensure you read the instructions on PE Preparation (given in item 5 above)
      • Attend the practical test, to be done during the weekly briefing.

      6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

      • In the very unlikely event that the PE had to be cancelled due to technical issues, attend the makeup PE on this day.
      • Note: This is not an alternative option for students who could not attend the PE, as all students need to do the PE at the same time.


      tP Week 12: Extra week for v1.5tP: Deliverables

      [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
      diff --git a/admin/tp-w13.page-vue-render.js b/admin/tp-w13.page-vue-render.js index 51bef88c20..7519e8746e 100644 --- a/admin/tp-w13.page-vue-render.js +++ b/admin/tp-w13.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"font-weight-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Admin info")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseOverview.html"}},[_v("Course Overview")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('mark',[_v("Using this Website")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseExpectations.html"}},[_v("Course Expectations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Course Structure \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('small',[_v("Course Briefing Videos")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('small',[_v("Weekly Schedule")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/lectures.html"}},[_c('small',[_v("Weekly Briefings")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_c('small',[_v("Tutorials")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/instructors.html"}},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/textbooks.html"}},[_v("Textbooks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/programmingLanguages.html"}},[_v("Programming Language")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_v("Standards/Conventions")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Individual Project (iP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-overview.html"}},[_c('small',[_v("iP (Individual Project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w2.html"}},[_c('small',[_v("iP: Week 2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w3.html"}},[_c('small',[_v("iP: Week 3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w4.html"}},[_c('small',[_v("iP: Week 4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w5.html"}},[_c('small',[_v("iP: Week 5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w6.html"}},[_c('small',[_v("iP: Week 6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w7.html"}},[_c('small',[_v("iP: Week 7")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w8.html"}},[_c('small',[_v("iP: Week 8")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-grading.html"}},[_c('small',[_v("iP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Team Project (tP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-overview.html"}},[_c('small',[_v("tP (team project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('small',[_v("tP: Expectations")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('small',[_v("tP: Timeline")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('small',[_v("tP: Constraints")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-teams.html"}},[_c('small',[_v("tP: Forming Teams")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w3.html"}},[_c('small',[_v("tP Week 3: Kickoff")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w4.html"}},[_c('small',[_v("tP Week 4: Set direction")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w5.html"}},[_c('small',[_v("tP Week 5: Gather requirements")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w6.html"}},[_c('small',[_v("tP Week 6: Define the MVP")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w7.html"}},[_c('small',[_v("tP Week 7: Practice iteration → v1.1")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w8.html"}},[_c('small',[_v("tP Week 8: First feature increment → v1.2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w9.html"}},[_c('small',[_v("tP Week 9: MVP → v1.3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w10.html"}},[_c('small',[_v("tP Week 10: Alpha version → v1.4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w11.html"}},[_c('small',[_v("tP Week 11: Release candidate → v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w12.html"}},[_c('small',[_v("tP Week 12: Extra week for v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w13.html"}},[_c('small',[_v("tP Week 13: Public release → v1.6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('small',[_v("tP: Deliverables")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-ped.html"}},[_c('small',[_v("tP: Practical Exam Dry Run")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-pe.html"}},[_c('small',[_v("tP: Practical Exam")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('small',[_v("tP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('small',[_v("tP: Supervision/Guidance")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/peerEvaluations.html"}},[_v("Peer Evaluations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tools.html"}},[_v("Tools")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/exams.html"}},[_v("Exams")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/participation.html"}},[_v("Participation Marks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_v("Grade Breakdown")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Appendices \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('small',[_v("Apdx A: Course Principles")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('small',[_v("Apdx B: Course Policies")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('small',[_v("Apdx C: FAQ")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('small',[_v("Apdx D: Getting Help")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('small',[_v("Apdx E: Using GitHub")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('small',[_v("Apdx F: Handling Team Issues")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])])])])])],1)],1)])]),_v(" "),_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('br'),_v(" "),_m(1),_v(" "),_c('div',{attrs:{"id":"main"}},[_m(2),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(3),_v(" "),_m(4),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"86%","y":"92%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.6")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to put in final touches while minimizing delivery risks "),_c('span',{staticClass:"dimmed"},[_v("i.e., risks of regressions or deadline overruns")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the quality necessary for a public release.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Freeze features. Strictly limit changes to bug fixes only.")])])])])]),_v(" "),_m(5),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of our policy on reuse")]),_v(" (e.g., "),_c('mark',[_v("how to give credit for reused code")]),_v("):")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Policy on reuse "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"policy-on-reuse"}},[_v("Policy on reuse "),_c('small',[_c('small',[_c('span',{staticClass:"badge rounded-pill bg-light text-danger"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#policy-on-reuse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('p',[_c('strong',[_v("Scope:")]),_v(" The policies on reuse apply to all project deliverables that are normally expected to be your own work (i.e., code, code comments, documentation, diagrams, images, etc.) unless stated otherwise.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse is encouraged. However, note that reuse has its own costs")]),_v(" (such as the learning curve, additional complexity, usage restrictions, and unknown bugs). Furthermore, you will not be given credit for work done by others. Rather, you will be given credit for "),_c('em',[_v("reusing")]),_v(" work done by others.")]),_v(" "),_c('ul',[_c('li',[_v("You are allowed to reuse work from your classmates or past students, subject to following conditions:\n"),_c('ul',[_c('li',[_v("The work has been shared publicly by us or the authors.")]),_v(" "),_c('li',[_v("You clearly give credit to the original author(s).")])])]),_v(" "),_c('li',[_v("You are allowed to reuse code from external sources, subject to following conditions:\n"),_c('ul',[_c('li',[_v("You clearly give credit to the original author/source.")]),_v(" "),_c('li',[_v("You do not violate the license under which the work has been released. Please "),_c('strong',[_v("do not use 3rd-party images/audio")]),_v(" in your software unless they have been specifically released to be used freely. Just because you found it in the Internet does not mean it is free for reuse.")])])]),_v(" "),_c('li',[_c('mark',[_v("Always get permission from us before you reuse")]),_v(" third-party libraries. Please post your 'request to use 3rd party library' in our "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". That way, the whole class get to see what libraries are being used by others.\n"),_c('ul',[_c('li',[_v("Our approval is given based on compliance with the course. Compliance with the license of the reused software is entirely your responsibility. While we don't anticipate such a case, any liability from improper reuse of a third-party library is to be borne by the person who reused it (i.e., not NUS).")]),_v(" "),_c('li',[_v("Once a 3rd party library has been approved for one student/team, it can be used freely by others without asking for approval again.")])])])]),_v(" "),_c('div',{attrs:{"id":"cite-reuse-immediately"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Keep track of code reuse")]),_v(" If you reuse/adapt code from elsewhere, cite the source in code immediately. Otherwise you will not remember the source of code reuse later. Not citing the original source can land you in trouble for plagiarism.")])])],1),_v(" "),_c('div',{attrs:{"id":"using-tool-generated-code"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_c('strong',[_v("FAQ: Can I use code generated by AI tools")]),_v(" (e.g., Copilot, ChatGPT)?")]),_c('br'),_v(" "),_c('strong',[_v("Answer:")]),_v(" We don't explicitly prohibit you from using those tools, but we strongly discourage you from using them in a way that hinders your learning. For example,")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Use a tool such as GitHub co-pilot to increase the productivity of writing code (e.g., auto-complete the next bit of code).")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Write the required code yourself, and then, use the tool to generate alternative implementations, compare, and use that experience to improve your own coding skills.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" When troubleshooting/debugging, use a tool to help you locate the problem.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])]),_v(" Give the problem description to the tool and get it to generate the code for you, and use it directly in your submission, and claim it as your own.")])]),_v(" "),_c('p',[_v("Other caveats:")]),_v(" "),_c('ul',[_c('li',[_v("Using such tools can result in your code being same as others in the class. If such code was flagged for plagiarism, \"It was generated by a tool\" will not be a valid excuse. Therefore, if you use (possibly with minor changes) a non-trivial code snippet generated by a tool (e.g., an entire method), it is safer to acknowledge in the code as a case of code reuse.")]),_v(" "),_c('li',[_v("Those tools sometimes can confidently give you the wrong answer. So, have a healthy level of scepticism about the accuracy of the code generated by such tools.")])])])],1),_v(" "),_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Automated plagiarism checks ahead!")]),_v(" We'll be using automated plagiarism checks to detect uncredited reuses of content from other CS2103 tP's i.e., tP's done by other teams in this batch and "),_c('mark',[_c('em',[_v("all")]),_v(" previous batches")]),_v(". These checks will be done "),_c('em',[_v("after")]),_v(" the final submissions. The cases detected will be verified and reported to the university administration for disciplinary action. As you know, NUS enforces a penalty of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("F")]),_v(" grade for the entire course (with no option to S/U or withdraw from the course) for plagiarism offenses.")])]),_v(" "),_c('box',[_c('h4',{attrs:{"id":"giving-credit-for-reused-work"}},[_v("Giving credit for reused work"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#giving-credit-for-reused-work","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Given below are how to give credit for things you reuse from elsewhere. These requirements are specific to this course "),_c('span',{staticClass:"dimmed"},[_v("i.e., not applicable outside the course (outside the course, you should follow the rules specified by your employer and the license of the reused work)")])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("used a third party library")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Individual project (iP): Mention in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README")]),_v(" file (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Team project (tP):\n"),_c('ul',[_c('li',[_v("Mention in the Developer Guide (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Mention in "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-ppp"}},[_v("Project Portfolio Page")]),_v(" if the library has a significant relevance to the features you implemented.")],1)])])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("reused code snippets found on the Internet")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. from StackOverflow answers")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred code in another software")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred project code by current/past student")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If you read the code to understand the approach and implemented it yourself, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("inspired")]),_v(" by https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted code from elsewhere but modified it significantly, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("adapted")]),_v(" from https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted a non-trivial code block (possibly with minor modifications "),_c('span',{staticClass:"dimmed"},[_v("renaming, layout changes, changes to comments, etc.")]),_v("), also mark the code block as reused code (using "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-authorTags"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(" with the "),_c('mark',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-reused")])]),_v(" suffix)"),_c('br'),_v("\nFormat:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" {yourGithubUsername}-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//{Info about the source...}")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v("{"),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_v("Reused "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("code")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(possibly with minor modifications)")]),_v(" here ...}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}}),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])])]),_v("\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example of reusing a code snippet (with minor modifications):"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_v("persons = getList()\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" johndoe-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Reused from https://stackoverflow.com/a/34646172")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// with minor modifications")]),_v("\n")]),_c('span',[_v("Collections.sort(persons, "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("new")]),_v(" Comparator() {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-meta"}},[_v("@Override")]),_v("\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("int")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("compare")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(CustomData lhs, CustomData rhs)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" lhs.customInt > rhs.customInt ? -"),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("1")]),_v(" : "),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("0")]),_v(";\n")]),_c('span',[_v(" }\n")]),_c('span',[_v("});\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" persons;\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])],1)]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('strong',[_v("Giving credit for reused images")]),_v(" (and other media assets): Ideally, the source should be credited where the asset appears. For example, if you reused an image in your GUI, you can credit the source where a screenshot of the GUI showing that image appears first in your user guide. In addition, you can also acknowledge the sources in your GitHub project's landing page (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(")")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB3 code")]),_v(": If your team project code follows a design similar to AB3, that doesn't mean you need to credit AB3 -- this is because a brownfield project is "),_c('em',[_v("expected")]),_v(" to follow existing code/design where possible, in the interest of consistency. This type of reuse need not be acknowledged/credited specifically.")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB4 code")]),_v(": If you reused any code from "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(", cite it as you would cite reuse from any other external source.")])]),_v(" "),_c('p',[_c('strong',[_v("Giving credit for reusing from course materials")]),_v(" (e.g., course textbook, tutorials, instructional resources from se-education.org) is not required, although you are welcome to do so. Reason: Those materials were created by the teaching team for you to use/reuse.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse within the team")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing code written by a team member)")]),_v(" need not be mentioned explicitly. However, you should factor in such reuse when you estimate effort contributed by each team member.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse of documentation")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing a UG/DG section)")]),_v(" is no different from code reuse. Such reuse should be credited as well.")]),_v(" "),_c('p',[_c('strong',[_v("Citing the use of AI-generated/assisted work")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using GitHub Copilot for project work)")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If the use of the tool was localized into a few places "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it to write a few methods/classes only)")]),_v(", cite its use in comments near where you used it.")]),_v(" "),_c('li',[_v("If the use was more widespread "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it as an auto-complete tool during most of your coding)")]),_v(", cite the usage (i.e., which tool, who used it, the extent of use) in the following location instead (i.e., no need to cite in code comments):\n"),_c('ul',[_c('li',[_v("iP: in the README file")]),_v(" "),_c('li',[_v("tP: in the DG, under the Acknowledgements section")])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-authorTags"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project mid-v1.3 (extract) →")]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-ppp"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project → Deliverables → Project Portfolio Page")]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:deliverablesPPP-teamTasks"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Team-Based Tasks")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('em',[_v("Team-tasks")]),_v(" are the tasks that "),_c('em',[_v("someone")]),_v(" in the team has to do.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Examples of team-tasks")])]},proxy:true}])},[_v(" "),_c('span',{attrs:{"id":"example-team-tasks"}},[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])]),_c('p')],1)],1)]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])],1),_c('p')],1)])])],1)])])])],1),_c('p')])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-fix-pe-d-bugs"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(6),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-fix-pe-d-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(7),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("After the PE-D")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-d-after-the-session"}},[_c('span',{staticClass:"badge bg-primary"},[_v("PE-D")]),_v(" "),_c('span',{staticClass:"text-primary"},[_v("After the session")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-d-after-the-session","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The relevant bug reports will be transferred to your issue tracker")]),_v(" within a day after the session is over. Once you have received the bug reports for your product, you can decide whether you will act on reported issues before the final submission v1.6. For some issues, the correct decision could be to reject or postpone to a version beyond v1.6."),_c('br'),_v("\nReminder: There is no penalty for any of the bugs you received in the PE-D.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('box',{attrs:{"type":"info","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-angry",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-info"},[_c('strong',[_v("Dealing with \"What the h___ the tester was thinking?\" type bug reports")])])]),_v(" "),_c('p',[_v("Some bug reports will make you angry because they seem baseless, wrong, rude etc. It's still possible to get value from such bug reports though:")]),_v(" "),_c('ul',[_c('li',[_v("After you got over the initial indignation, dig deeper to see if there's even the slightest possibility that there is a bug. For example, consider this scenario:\n"),_c('ol',[_c('li',[_v("The tester claims a certain command doesn't work.")]),_v(" "),_c('li',[_v("All your team members tried the exact same command and it works as advertised. What the h___ the tester is trying to pull here?")]),_v(" "),_c('li',[_v("In reality, the error is actually caused by a duplicate entry in the database resulting from a previous command; the tester didn't mention that command in the bug report (because s/he didn't realize the two are connected).")])])]),_v(" "),_c('li',[_v("The reported bug might be non-existent but the tester's screw up can indicate other areas to improve. For example, the tester reports a missing feature that is clearly mentioned as 'not implemented' in the UG, but perhaps the UG can be improved to make that fact harder to miss?")]),_v(" "),_c('li',[_v("What exactly about the bug report that makes you angry? Remind yourself not to do the same offence when you report bugs yourself in the future.")])]),_v(" "),_c('p',[_v("Use the pain of dealing with this kind of bug reports as an opportunity to develop the following mindset:")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(a)")]),_c('div',[_c('p',[_c('strong',[_v("The product is "),_c('em',[_v("guilty until proven innocent")])]),_v(": If the bug report has even a "),_c('em',[_v("hint")]),_v(" of something amiss with the product, it's your (not the tester's) responsibility to try and prove if it is really a problem or not. Why? because finding a bug is a win for "),_c('em',[_v("you")]),_v(" -- as you can then fix it and thereby avoid the embarrassment of releasing a buggy product.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(b)")]),_c('div',[_c('p',[_c('strong',[_v("A crappy bug report is better than no bug report")]),_v(": If the bug actually exists, it is better to have "),_c('em',[_v("some")]),_v(" indication about it than none at all. In a real project, a tester that fails to find bugs can cause more harm to your career than a tester who finds bugs but doesn't report them well.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(c)")]),_c('div',[_c('p',[_c('strong',[_v("I "),_c('em',[_v("used")]),_v(" to get angry at bug reports, but not anymore")]),_v(": If you work hard, take pride in the quality of your work, it's no wonder that you get angry when others find faults with your work incorrectly. Aim to move past that phase where you take bug reports personally. The sooner you can tackle any sh*tty bug report calmly and objectively, the sooner you'll rise to the 'professional' software engineer level.")])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you have received stray bug reports")]),_v(" (i.e., bug reports that don't seem to be about your project), do let us know ASAP (email the prof).")]),_v(" "),_c('li',[_c('strong',[_v("You can navigate to the original bug report")]),_v(" (via the back-link provided in the bug report given to you) and post in that issue thread to communicate with the tester who reported the bug "),_c('span',{staticClass:"dimmed"},[_v("e.g. to ask for more info")]),_v(", etc. However, the tester is not obliged to respond. Note that simply replying to the bug report in your own repo will not notify the tester.\n"),_c('ul',[_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Do not argue with the tester to try to convince that person that your way is correct/better. If at all, you can gently explain the rationale for the current behavior but do not waste time getting involved in long arguments. If you think the suggestion/bug is unreasonable, just thank the tester for their view and discontinue to discussion.")])])]),_v(" "),_c('li',[_c('strong',[_v("Aim to "),_c('mark',[_v("do a systematic triaging of issues received")])]),_v(". Some suggestions:\n"),_c('ul',[_c('li',[_v("Close duplicate issues.")]),_v(" "),_c('li',[_v("Use labels (create new labels if necessary) to,\n"),_c('ul',[_c('li',[_v("differentiate "),_c('em',[_v("bugs")]),_v(" from the rest (e.g., feature suggestions/flaws).")]),_v(" "),_c('li',[_v("indicate priority of the bugs that need fixing.")])])]),_v(" "),_c('li',[_v("Assign each bug to the person who should fix it.")])])]),_v(" "),_c('li',[_c('strong',[_v("You may ignore "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type/severity.*")]),_v(" labels given by the tester.")]),_v(" They will not affect you or the tester either way -- they were there just for the testers to practice. You may apply your own type/severity labels if you wish."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" In particular, beware of simply following the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" given by the tester; it is your job to decide the correct type of the issue. e.g., What the tester labeled as a "),_c('em',[_v("bug")]),_v(" might actually be a "),_c('em',[_v("feature flaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report is simply a feature suggestion")]),_v(", you can take note of it and close it (to reduce clutter in the issue tracker, and to make it easy for the teaching team to track your progress on dealing with PE-D issues). Similarly, you can close PE-D issues not relevant to v1.6.")])]),_v(" "),_c('box',{attrs:{"type":"wrong","seamless":""}},[_c('p',[_c('strong',[_v("Note that listing bugs as 'known bugs' in the UG or specifying "),_c('em',[_v("unreasonable")]),_v(" constraints in the UG to make bugs 'out of scope' will not exempt those bugs from the final grading.")]),_v(" That is, PE testers can still earn credit for reporting those bugs and you will still be penalized for them."),_c('br'),_v("\nHowever, a product is allowed to have 'known limitations' "),_c('span',{staticClass:"dimmed"},[_v("(e.g., a daily expense tracking application meant for students is unable to handle expenses larger than $999)")]),_v(" as long as they don't degrade the product's use within the intended scope. They will not be penalized.")])]),_v(" "),_c('box',{attrs:{"type":"info","tags":"m--cs2103","seamless":""}},[_c('p',[_c('strong',[_v("Even bugs inherited from AB3 need to be fixed.")]),_v(" As mentioned in a previous week, even bugs you inherited from AB3 need fixing "),_c('span',{staticClass:"dimmed"},[_v("(because \"we inherited it from the previous dev team\" is not a valid excuse to leave a bug unfixed)")]),_v(". If you are unsure if something is such a bug that need fixing, please post in the forum.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Identify bugs you missed in the PE-D:")]),_v(" Visit the issue tracker of the team you tested and see bugs reported by others who tested the same product. Identify bugs you missed (if any). That knowledge might help you find similar bugs in your own product as well as find more bugs during the PE.")])])],1)])],1),_c('p'),_v(" "),_m(8),_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1),_v(" "),_m(9),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q1: Performance of PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("In this context, a good bug report,")]),_v(" "),_c('ul',[_c('li',[_v("has a descriptive title,")]),_v(" "),_c('li',[_v("has enough details,")]),_v(" "),_c('li',[_v("severity/type labels chosen are not too far off,")]),_v(" "),_c('li',[_v("is written in a non-confrontational tone, and")]),_v(" "),_c('li',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])]),_v(" "),_c('p',[_v("Rate each tester on the following scale:")]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Poor")]),_v(" "),_c('th',[_v("Below expectations")]),_v(" "),_c('th',[_v("Meets expectations")]),_v(" "),_c('th',[_v("Exceeds expectations")]),_v(" "),_c('th',[_v("Greatly exceeds expectations")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("no bug reports from this tester")]),_v(" "),_c('td',[_v("just a few bug reports, and none are good")]),_v(" "),_c('td',[_v("3-5 good bug reports")]),_v(" "),_c('td',[_v("6-8 good bug reports")]),_v(" "),_c('td',[_v("9 or more good bug reports")])])])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q2: Rank PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("Rank the PE-D testers based on their performance (five rank 1 to the top performing tester):")]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester A")]),_v(": rank __"),_c('br'),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester B")]),_v(": rank __"),_c('br'),_v("\n...")])]),_c('p')],1),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_v("PE-D bug titles will be prefixed with tester ID e.g., ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE-D][Tester A] UG does not load")]),_v(") to make it easy for you to "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("using GitHub issue tracker's filters/search box")]},proxy:true}])},[_v("filter")]),_v(" bugs reported by each tester."),_c('br'),_v("\nFurthermore, tester ID mapping (i.e., who is Tester A, Tester B, etc.) will be sent to you via email within 1 day after the PE-D.")],1)])]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-submit-final-deliverables-tue-nov-12th-14-00"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(10),_v(" "),_m(11),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-submit-final-deliverables-tue-nov-12th-14-00","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_m(12),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Penalty for late submission")]),_v(" (per file): "),_c('br'),_v(" "),_c('mark',[_v("-1 mark for missing the deadline (up to 2 hour of delay).")]),_c('br'),_v("\n-2 for an "),_c('em',[_v("extended delay")]),_v(" (up to 24 hours late)."),_c('br'),_v("\nPenalty for delays beyond 24 hours is determined on a case by case basis.\n"),_m(13)]),_v(" "),_m(14),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Follow submission instructions closely")]),_v(". "),_c('mark',[_v("Any non-compliance will be penalized")]),_v(". e.g. wrong file name/format."),_c('br'),_v("\nCanvas might automatically add a file name suffix (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-1.pdf")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-2.pdf")]),_v(", ...) if you upload a file multiple times. You can safely ignore that suffix.")]),_v(" "),_m(15)]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('big',[_c('strong',[_v("Submissions:")])])],1)]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',{attrs:{"id":"tip-how-to-convert-to-pdf"}},[_c('box',{attrs:{"id":"caution-on-pdf-conversion","type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])],1),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Side benefits for early submissions:")]),_v(" Given that "),_c('em',[_v("using buffers to reduce the risk of deadline overruns")]),_v(" is a learning outcome of this course, we strongly encourage setting an internal submission deadline a few hours earlier than the actual deadline. As an incentive, we plan to perform some checks on early submissions and inform you if we found issues with your submission "),_c('span',{staticClass:"dimmed"},[_v("(e.g., incorrect file name/format)")]),_v(", thus giving you a chance to fix them before the deadline and avoid a penalty for it.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("You may use automated tools to improve documentation:")]),_v(" e.g., tools such as Grammarly may be used to improve the writing quality and find grammar errors.")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("The icon "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" indicates team submissions.")]),_v(" Only one person need to submit on behalf of the team but we recommend that others help verify the submission is in order."),_c('br'),_v(" "),_c('mark',[_v("We will not entertain requests to limit late penalties of team submissions to one person")]),_v(" even if the delay was one person's fault. That is, the responsibility (and the penalty) for team submissions are to be shared by the whole team rather than burden one person with it.")])])],1),_v(" "),_m(16),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Executable "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should be an executable jar file")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Should be "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v(" i.e., it can be used by end-users")]},proxy:true}])},[_c('em',[_v("releasable")])])],1),_v(". While some features may be scheduled for later versions, the features in v1.6 should be good enough to make it usable by at least some of the target users.")]),_v(" "),_c('li',[_v("Also note the following constraint:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')])])])],1),_c('p'),_v(" "),_m(17),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Source Code "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should match v1.6 deliverables")]),_v(" i.e., executable, docs, website, etc.")]),_v(" "),_c('li',[_c('strong',[_v("To be delivered as a Git repo.")]),_v(" Ensure your GitHub team repo is updated to match the executable.")])])])])])],1),_c('p'),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_v("Reminder: double-check to ensure the code attributed to you by RepoSense is correct.")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Making the Code RepoSense-Compatible "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_c('ul',[_c('li',[_v("Go to the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tp Code Dashboard")]),_v(". Click on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("")]),_v(" icon against your name and verify that the "),_c('mark',[_v("lines attributed to you (i.e., lines marked as green)")]),_v(" reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines."),_c('br'),_v(" "),_c('img',{attrs:{"src":"/website/admin/images/greenLines.png","width":"600"}})])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("More info on how to make the code RepoSense compatible:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-2"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-2"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_m(18),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → User Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(19),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Developer Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_m(20),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Project Portfolio Page "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])]),_c('p')],1)])])],1),_c('p'),_v(" "),_m(21),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Product Website "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_v("When setting up your team repo, you would be configuring "),_c('strong',[_v("the GitHub Pages feature to publish your documentation")]),_v(" as a website.")]),_v(" "),_c('h4',{attrs:{"id":"website-home-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Home page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-home-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Update to match your product.")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('h4',{attrs:{"id":"website-ui-png"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ui-png","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('mark',[_v("Ensure the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" matches the current product")])])])]),_v(" "),_c('div',{staticClass:"indented-level3",attrs:{"id":"tips-for-product-screenshot"}},[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)]),_v(" "),_c('h4',{attrs:{"id":"website-aboutus-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("AboutUs Page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-aboutus-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use a suitable profile photo.")])])]),_v(" "),_c('div',{staticClass:"indented-level2",attrs:{"id":"profile-photo"}},[_c('p',[_v("The purpose of the profile photo is for the reader to identify you. Therefore, choose a "),_c('mark',[_v("recent individual photo showing your face clearly")]),_v(" (i.e., not too small) -- somewhat similar to a passport photo. Given below are some examples of good and bad profile photos."),_c('br'),_v(" "),_c('pic',{staticStyle:{"width":"365.33px"},attrs:{"eager":"","src":"/website/admin/images/profilephotos.png"}})],1),_v(" "),_c('p',[_v("If you are uncomfortable posting your photo due to security reasons, you can post a lower resolution image so that it is hard for someone to misuse that image for fraudulent purposes. If you are concerned about privacy, you may use "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/File:Portrait_placeholder.png"}},[_v("a placeholder image")]),_v(" in place of the photo in course-related documents that are publicly visible.")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Include a link to each person's PPP page.")])]),_v(" "),_c('li',[_c('strong',[_v("Team member names:")]),_v(" you may use the full name, part of the name, or GitHub username of the team member.")])]),_v(" "),_c('h4',{attrs:{"id":"website-ug-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("UG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ug-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])]),_v(" "),_c('h4',{attrs:{"id":"website-dg-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("DG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-dg-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])])])])])],1),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-prepare-for-the-practical-exam"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(22),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-prepare-for-the-practical-exam","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Overview")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('strong',[_v("PE is not entirely a pleasant experience, but is an essential component")]),_v(" that aims to increase the quality of the tP work, and the rigor of tP grading.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("more details on the motivation and objectives...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The upfront objective of the PE is to increase the rigor of project grading.")]),_v(" Assessing most aspects of the project involves an element of subjectivity. As the project counts for a large percentage of the final grade, it is not prudent to rely on evaluations of tutors alone as there can be significant variations between how different tutors assess projects. That is why we collect more data points via the PE to minimize the chance of your project being affected by evaluator-bias.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates your testing skills")]),_v(", done as the following two-parts:\n"),_c('ol',[_c('li',[_c('strong',[_v("You will be given a chance to find bugs in a different software.")]),_v(" Furthermore, you will be given an opportunity to "),_c('s',[_v("defend your bug reports against any possible objections")]),_v(" interact with the developers (anonymously) to refine the bug report further "),_c('span',{staticClass:"dimmed"},[_v("e.g., correct the severity level if the level you chose initially was incorrect")]),_v(". If you report possible bugs that turn out to be actual bugs, you earn marks (provided the product actually had bugs in the first place).")]),_v(" "),_c('li',[_c('strong',[_v("Your product will be subjected to a rigorous testing")]),_v(" and you will be given a chance to point out any inaccuracies in the bugs reported. You will lose marks for any bugs that turned out to be real bugs, but only if your work has more bugs than a certain bar.")])])]),_v(" "),_c('li',[_c('strong',[_v("The above two can lead to high-rigor, "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("based on how well you achieve the objectives of testing, as opposed to indirect measures such as number of test cases")]},proxy:true}])},[_c('em',[_v("outcome-based")])]),_v(" evaluation of your testing skills")],1),_v(". The alternative is to rely solely on other easy-to-measure metrics "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the number of test cases, test coverage, test LoC etc.)")]),_v(" which we don't think as good representations of your actual testing skills.\n"),_c('strong',[_v("The "),_c('em',[_v("ultimate")]),_v(" objective of the PE is not even the higher rigor of grading.")]),_v(" Because of the PE, you will realize that any bugs are very likely to be detected, which means you will work extra hard to avoid bugs; and THAT is the real benefit. Ultimately, "),_c('span',{staticClass:"text-success"},[_c('strong',[_v("what we want is for you to internalize a higher standard for testing and a lower tolerance for bugs in your own code")])]),_v(" -- something that can have a longer-lasting impact on your future careers, beyond the mere course grade.")]),_v(" "),_c('li',[_c('strong',[_v("Problem: There is no way we can carry out the above-mentioned")]),_v(" two-part evaluation at a high-level of rigor if using tutors as testers, or using an automated testing script. "),_c('span',{staticClass:"dimmed"},[_v("e.g., some tutors might not have the motivation to try hard enough to find bugs, and it will be hard to find tutors willing to spend many hours testing products so near to their own exams.")]),_c('br'),_v(" "),_c('strong',[_v("Solution: Get the two parts of the evaluation to feed each other")]),_v(" by getting student to test each other's products.")]),_v(" "),_c('li',[_c('strong',[_v("The fact that you are testing products created by your classmates and objecting to bugs reported by your classmates can make this a rather 'unpleasant' experience")]),_v(". You might feel like "),_c('em',[_v("being pitted against each other")]),_v(", or as if "),_c('em',[_v("you are forced to bring down each other")]),_v(". But as you read above, it is a necessary evil for this evaluation to be even possible. Given the actual goal is to get you to create products with very few bugs, we think switching off the 'collaborative learning' mode for just a few days is a price worth paying to achieve that goal. After all, the PE is an evaluation activity (not a "),_c('em',[_v("learning activity")]),_v(") and happens "),_c('em',[_v("after")]),_v(" the regular learning period is over.")]),_v(" "),_c('li',[_c('strong',[_v("You are not taking marks from someone else")]),_v(" -- at least, don't think of it that way. The point of contention is 'is this really a bug?' which is independent of the people involved. Furthermore, the reward for detecting a bug and the penalty for having a bug in your code are calculated independently.")]),_v(" "),_c('li',[_c('strong',[_v("Still, "),_c('em',[_v("none of us")]),_v(" likes it when others point out problems of our work")]),_v(". Some of us don't even like pointing out problems of others' work. But "),_c('mark',[_v("we just have to learn not to take bug reports personally")]),_v(". Another important intended outcome is to be able to report bugs in a way that doesn't feel like you are "),_c('em',[_v("attacking")]),_v(" or trying to "),_c('em',[_v("sabotage")]),_v(" the dev team.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates aspects other than testing")]),_v(" e.g., your product evaluation skills, effort estimation skills etc. When evaluating those aspects in particular, they are "),_c('mark',[_v("not graded solely based on peer ratings")]),_v(". Rather, PE data are cross-validated with tutors' grades to identify cases that need further investigation. When peer inputs are used for grading, they are usually combined with tutors' grades with appropriate weight for each. In some cases ratings from team members are given a higher weight compared to ratings from other peers, if that is appropriate.")])])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("The PE is divided into four phases")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 1: Bug Reporting")])]),_v(": "),_c('span',{attrs:{"id":"pe-p1-desc"}},[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part I")]),_v(" "),_c('strong',[_v("Product Testing")]),_v(" [60 minutes] -- to focus on reporting bugs in the product (but can report documentation bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part II")]),_v(" "),_c('strong',[_v("Evaluating Documents")]),_v(" [30 minutes] -- to focus on reporting bugs in the UG and DG (but can report product bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part III")]),_v(" "),_c('strong',[_v("Overall Evaluation")]),_v(" [15 minutes] -- to give overall evaluation of the product, documentation, effort, etc.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part IV")]),_v(" "),_c('strong',[_v("Trimming Bugs")]),_v(" [half a day] -- For testers to select up to 7 bugs to send to the dev team.")])])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 2: Developer Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p2-desc"}},[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 3: Tester Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p3-desc"}},[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-secondary"},[_c('strong',[_v("Phase 4: Tutor Moderation")])]),_v(": "),_c('span',{attrs:{"id":"pe-p4-desc"}},[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")]),_c('br'),_c('br')])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Grading")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Your performance in the practical exam will affect your final grade and your peers', as explained in "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('em',[_v("Admin: Project Grading")])]),_v(" section.")]),_v(" "),_c('li',[_v("As such, we have put in measures to identify and "),_c('mark',[_v("penalize insincere/random evaluations")]),_v(".")]),_v(" "),_c('li',[_v("Also see:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Notes on how marks are calculated for PE "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p')])])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Preparation, Restrictions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-preparation-restrictions"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Preparation, Restrictions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-preparation-restrictions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"pe-mode-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Mode: you can choose between remote or F2F")]),_v(" (we'll use a Canvas survey to collect your preferred mode):\n"),_c('ul',[_c('li',[_c('strong',[_v("Remote mode")]),_v(": This is the "),_c('mark',[_v("recommended mode")]),_v(". Proctored via Zoom. You'll need to join the Zoom session from a quiet place (i.e., conducive to an exam) at which you can set up a Zoom device for proctoring."),_c('br'),_v("\nChoose this mode only if you are able to comply with the Zoom proctoring requirements given further down.")]),_v(" "),_c('li',[_c('strong',[_v("F2F mode")]),_v(": Attend the PE at the lecture venue (UTown-AUD2)."),_c('br'),_v("\nChoose only if you are unable to use the remote mode (reason: higher the number of F2F attendees, higher the risk of Wi-Fi speed issues and GitHub throttling issues).")])])])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Those opting for the F2F mode can ignore any Zoom-related points")]),_v(" in the instructions below.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("When")]),_v(": "),_c('mark',[_v("Last lecture slot of the semester")]),_v(" (Fri, Nov 15th). Remember to "),_c('mark',[_v("join 15-30 minutes earlier")]),_v(" than usual lecture start time. The Zoom link will be given to you closer to the day.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("PE Phase 1 will be conducted under exam conditions. For the remote mode, "),_c('mark',[_v("we will be following the "),_c('a',{attrs:{"href":"https://mysoc.nus.edu.sg/academic/e-exam-sop-for-students/"}},[_v("SoC's E-Exam SOP")])])]),_v(", combined with the deviations/refinements given below. Any non-compliance will be dealt with similar to a non-compliance in the final exam."),_c('br')])])]),_v(" "),_c('div',{attrs:{"id":"pe-proctoring-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Remote mode proctoring will be done via Zoom.")]),_v(" No admission if the following requirements are not met.\n"),_c('ul',[_c('li',[_c('strong',[_v("You need two Zoom devices")]),_v(" (PC: chat, audio "),_c('s',[_v("video")]),_v(", Phone: video, "),_c('s',[_v("audio")]),_v("), unless you have an external webcam for your PC.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" To change the Zoom display name as required by the PE, join the Zoom call, go to the 'Participation' panel, and search for yourself. Then, click on 'More', followed by 'Rename'.")]),_v(" "),_c('li',[_c('strong',[_v("Add your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE_seat_number]")]),_v(" in front of the "),_c('em',[_v("first name")]),_v(" of your Zoom display name")]),_v(", in your Zoom devices. "),_c('mark',[_v("Seat numbers can be found in "),_c('a',{attrs:{"href":"https://docs.google.com/spreadsheets/d/e/2PACX-1vSUbcJpMC5OdJkr_K6VxDwAkkrwJsqAFSPwHmZq88EbOdAWIPMeYvDQDYOUEcsEYVwACmAz5hH0W0ZY/pubhtml?gid=0&single=true"}},[_v("here")])]),_v(" about 2 days before the PE. e.g.,\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18] John Doe")]),_v(" ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("M18")]),_v(" is the seat number)")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18][PC] John Doe")]),_v(" (for the PC, if using a phone as well)")])])]),_v(" "),_c('li',[_c('strong',[_v("Set your camera")]),_v(" so that "),_c('em',[_v("all")]),_v(" the following are visible:\n"),_c('ol',[_c('li',[_v("your face (side view, "),_c('mark',[_v("no mask")]),_v(")")]),_v(" "),_c('li',[_v("your hands")]),_v(" "),_c('li',[_v("the work area (i.e., the tabletop)")]),_v(" "),_c('li',[_v("the computer screen"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/zoomCameraExample.png","width":"362"}})],1)])])])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Strongly recommended to join the Zoom waiting room "),_c('mark',[_v("15-30 minutes before the start time")]),_v(".")]),_v(" Admitting you to the Zoom session can take some time. You need to be in the meeting and ready to start the PE by 4.05pm"),_c('br'),_v(" "),_c('strong',[_v("If on F2F mode:")]),_v(" Strongly recommended to arrive at lecture venue (UTown-AUD2) around 10-15 minutes early. We can allow only 5 minutes (i.e., until 4.05pm) for you to get ready to start the PE.")]),_v(" "),_c('li',[_c('strong',[_v("In case of Zoom outage")]),_v(", we'll fall back on MS Teams (MST). Make sure you have MST running and have joined the "),_c('a',{attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82"}},[_v("MST Team for the class")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recording the screen is not required.")])]),_v(" "),_c('li',[_c('strong',[_v("You are allowed to use head/ear phones.")]),_v(" But no talking allowed (unless you are talking to the invigilator) -- so, no talking/singing to yourself as this can be mistaken for a rule violation.")]),_v(" "),_c('li',[_c('strong',[_c('mark',[_v("Only one screen")]),_v(" is allowed")]),_v(" (for both remote mode and F2F mode). If you want to use the secondary monitor, you should switch off the primary monitor. The screen being used should be fully visible in the Zoom camera view."),_c('br'),_v("\nIf using a second device for Zoom proctoring, the screen of that device should only be used for Zoom.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use the public chat channel to ask questions")]),_v(" from the prof. If you do, you might accidentally reveal which team you are testing.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use more than one CATcher instance")]),_v(" at the same time. Our grading scripts will red-flag you if you use multiple CATcher instances in parallel.")]),_v(" "),_c('li',[_c('strong',[_v("Use MS Teams (not Zoom) private messages to communicate with the prof.")]),_v(" Zoom sessions are invigilated by tutors, not the prof.")]),_v(" "),_c('li',[_c('strong',[_v("Do not view video Zoom feeds of others")]),_v(" while the testing is ongoing. Keep the video view minimized.")]),_v(" "),_c('li',[_c('strong',[_v("Bug reporting will be done using CATcher")]),_v(", similar to,")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"primary","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("PE-D Preparation")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("Ensure that you have accepted the invitation to join the GitHub org used by the course. Go to "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1"}},[_v("https://github.com/nus-cs2103-AY2425S1")]),_v(" to accept the invitation.")])]),_v(" "),_c('li',[_c('p',[_v("Ensure you have access to a "),_c('strong',[_v("computer that is able to run course projects")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. has the right Java version")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Ensure you can use "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")])]),_v(" on your computer. You should have done this when you smoke-tested CATcher earlier in the semester.")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("If not using CATcher")])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"not-using-catcher-warning"}},[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('div',{attrs:{"id":"pe-create-repo"}},[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Have a good screen grab tool")]),_v(" with annotation features so that you can quickly take a screenshot of a bug, annotate it, and post in using CATcher."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('kbd',[_v("Ctrl")]),_v("+"),_c('kbd',[_v("V")]),_v(" to paste a picture from the clipboard into a text box in a bug report.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("[Optional] Have a good screen recording tool")]),_v(" if you plan to use screen recording clips as part of your bug reports. Ensure that your screen recording tool can create small files as CATcher doesn't allow files bigger than 10Mb."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})]),_v(" As the CATcher support for uploading screen recordings is new and limited, use it only if strictly necessary -- use screenshots for other cases.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('span',{staticClass:"text-danger"},[_v("Download the product to be tested")])]),_v(".")])])]),_v(" "),_c('tabs',{attrs:{"active":"1","add-class":"ml-4"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified which team to test (likely to be in the morning of PE-D day), download the JAR file and the UG PDF file from the team's latest release.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified of the download location, download the zip file that bears your name. The password required to unzip it will be given to you at the start of the PE.")])])])],1),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Testing tips")])])]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Use easy-to-remember patterns in test data.")]),_v(" For example, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("12345678")]),_v(" as a phone number while testing and it appears as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2345678")]),_v(" somewhere else in the UI, you can easily spot that the first digit has gone missing. But if you used a random number instead, detecting that bug won't be as easy. Similarly, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Bee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Benny Lee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Charles Pereira")]),_v(" as test data (note how the names start with letters A, B, C), it will be easy to detect if one goes missing, or they appear in the incorrect order.")]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Go wide before you go deep")]),_v(". Do a light testing of all features first. That will give you a better idea of which features are likely to be more buggy. Spending equal time for all features or testing in the order the features appear in the UG is not always the best approach.")])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("During the bug reporting periods (i.e., "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")]),_v(" and "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part II")]),_v("), do not use websites/software not in the list given below.")]),_v(" If you need to visit a different website or use another software, please ask for permission first.\n"),_c('ul',[_c('li',[_v("Website: Canvas")]),_v(" "),_c('li',[_v("Website/software: MSTeams (only to communicate with the prof of Tech support)")]),_v(" "),_c('li',[_v("Website: Course website "),_c('span',{staticClass:"dimmed"},[_v("(e.g., to look up PE info)")])]),_v(" "),_c('li',[_v("Software: CATcher, any text editor, any screen grab/recording software")]),_v(" "),_c('li',[_v("Software: PDF reader "),_c('span',{staticClass:"dimmed"},[_v("(to read the UG/DG or other references such as the textbook)")])]),_v(" "),_c('li',[_v("Software: A text editor or word processing software "),_c('span',{staticClass:"dimmed"},[_v("(to keep notes while testing)")])])])]),_v(" "),_c('li',[_c('mark',[_c('strong',[_v("Do not visit GitHub in")]),_v(" "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")])]),_v(" unless you are going there to download a file the team has provided and is needed for testing. You may visit GitHub during part II and part III.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use any other software running")]),_v(" in the background e.g., Telegram chat.")]),_v(" "),_c('li',[_c('strong',[_v("This is a "),_c('em',[_v("manual")]),_v(" testing session")]),_v(". Do not use any test automation tools or custom scripts.")]),_v(" "),_c('li',[_c('strong',[_v("You may use any digital/physical notes")]),_v(" during the PE "),_c('span',{staticClass:"dimmed"},[_v("e.g., a list of things to check")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recommended to read the guidelines the dev team will follow when responding to your bug reports later")]),_v(", given in the panel below. This will help decide what kind of bugs to report.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs reported during the PE should be the result of your own testing")]),_v(". "),_c('span',{staticClass:"text-danger"},[_v("Reporting bugs found by others as your own will be reported as a case of academic dishonesty")]),_v(" (severity is similar to cheating during the final exam).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Guidelines for the dev team to follow when triaging PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("[Within 24 hours prior to the PE] Get CATcher 'warmed-up' for the PE")]),_v("."),_c('br'),_v(" "),_c('mark',[_v("Strongly recommended")]),_v(" to do the following about a day in advance, so that there is enough lead time to sort out any CATcher-related problems "),_c('em',[_v("before")]),_v(" the PE.\n"),_c('ol',[_c('li',[_v("Login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")]),_v(",\nwhile choosing the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(" as the session.")]),_v(" "),_c('li',[_v("Allow CATcher to create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(", when asked.")]),_v(" "),_c('li',[_v("Create a dummy bug report. Edit it. Delete it."),_c('br'),_v("\nCaution: Do not reuse these dummy bug reports (i.e., by editing them later) to submit real PE bugs.\nAs they were created outside the PE duration, they will be ignored by PE bug processing scripts.")]),_v(" "),_c('li',[_v("If you encounter any problems, post in the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")])])])])])])],1),_c('p'),_v(" "),_m(23)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-ensure-the-code-is-reposense-compatible"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(24),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-ensure-the-code-is-reposense-compatible","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{attrs:{"id":"midV13-repoSenseCompatible"}},[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_m(25),_v(" "),_c('p'),_v(" "),_m(26)])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking-2"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-3"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-3"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(27),_v(" "),_m(28),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(29),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Phases")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-phase-1-bug-reporting"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 1: Bug Reporting")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-bug-reporting","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_c('p'),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-i-product-testing-60-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part I")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Product Testing [60 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-i-product-testing-60-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >50%, a substantial bonus if >70%) of your bugs are "),_c('em',[_c('strong',[_v("accepted as reported")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" of the bug match the values you chose initially and the bug is accepted by the team).")]),_v(" "),_c('p',[_v("Take away: Aim for the "),_c('em',[_v("correct")]),_v(" severity/type etc. rather than the one that gives you most marks, as the former can end up earning you more marks in the end anyway.")])]),_v(" "),_c('p',[_c('strong',[_v("Test the product and report bugs")]),_v(" as described below. You may report both product bugs and documentation bugs during this period.")]),_v(" "),_c('div',[_c('box',[_c('h5',{attrs:{"id":"testing-instructions-for-pe-and-pe-d"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_c('strong',[_v("Testing instructions for PE and PE-D")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-instructions-for-pe-and-pe-d","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h6',{attrs:{"id":"a-launching-the-jar-file"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("a) Launching the JAR file")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#a-launching-the-jar-file","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Get the jar file to be tested:")])]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the "),_c('em',[_v("latest")]),_v(" JAR file from the team's releases page, if you haven't done this already.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the zip file from the given location (to be given to you at least a few hours before the PE), if you haven't done that already.")]),_v(" "),_c('li',[_v("The file is zipped using a two-part password.\n"),_c('ul',[_c('li',[_v("We will email you the second part in advance, via email (it's unique to each student). Keep it safe, and have it ready at the start of the PE.")]),_v(" "),_c('li',[_v("At the start of the PE, we'll give you the first part of the password (common to the whole class). Use combined password to unzip the file, which should give you another zip file with the name suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("_inner.zip")]),_v(".")]),_v(" "),_c('li',[_v("Unzip that second zip file normally (no password required). That will give you a folder containing the JAR file to test and other PDF files needed for the PE. "),_c('mark',[_v("Warning: do not run the JAR file while it is still inside the zip file")]),_v("."),_c('br'),_v("\nIgnore the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("padding_file")]),_v(" found among the extracted files. "),_c('span',{staticClass:"dimmed"},[_v("Its only purpose is to mask the true size of the JAR file so that someone cannot guess which team they will be testing based on the zip file size.")])]),_v(" "),_c('li',[_v("Recommended: Try above steps using the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103/website-base/files/14849276/JohnDoe.zip"}},[_v("this sample zip file")]),_v(" if you wish (first part of the password: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-")]),_v(", second part: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password2")]),_v(" i.e., you should use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-password2")]),_v(" to unzip it)."),_c('br'),_v("\nUse the JAR file inside it to try the steps given below as well, to confirm your computer's Java environment is as expected and can run PE jar files.")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"important","id":"tp-jar-testing-steps","seamless":""}},[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])]),_v(" "),_c('box',{attrs:{"type":"info"}},[_c('p',[_c('strong',[_c('span',{staticClass:"large"},[_v("If the product doesn't work at all:")])]),_v(" If the product fails catastrophically "),_c('span',{staticClass:"dimmed"},[_v("e.g., cannot even launch, or even the basic commands crash the app")]),_v(", do the following:")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Check the UG")]),_v(" of the team, to see if there are extra things you need to do before launching the JAR."),_c('br'),_v(" "),_c('strong',[_v("Confirm that you are using Java 17")]),_v(" and using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to run the JAR, as explained in points above.")]),_v(" "),_c('li',[_c('strong',[_v("Contact our head TA")]),_v(" via MS Teams (name: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Kim Hyeongcheol")]),_v(", NUSNET: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dcskh")]),_v(") and give him"),_c('br'),_v("\n(a) "),_c('strong',[_v("a screenshot")]),_v(" of the error message, and"),_c('br'),_v("\n(b) "),_c('strong',[_v("your GitHub")]),_v(" username.")]),_v(" "),_c('li',[_c('strong',[_v("Wait for him to give you a fallback")]),_v(" team to test."),_c('br'),_v("\nContact the prof (via MS Teams) if you didn't get a response from Kim within 5 minutes.")]),_v(" "),_c('li',[_c('strong',[_v("Delete bug reports you submitted for the previous team")]),_v(" (if any), using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("You should not go back to testing the previous team")]),_v(" "),_c('em',[_v("after")]),_v(" you've been given a fallback team to test.")])])]),_v(" "),_c('h6',{attrs:{"id":"b-what-to-test"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("b) What to test")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#b-what-to-test","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Test the product "),_c('mark',[_v("based on the User Guide (PDF version)")]),_v(" available from their releases page on GitHub.")]),_v(" "),_c('li',[_v("Do "),_c('mark',[_c('em',[_v("system")]),_v(" testing first")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product work as specified by the documentation?")]),_v(". If there is time left, you can "),_c('mark',[_v("do "),_c('em',[_v("acceptance")]),_v(" testing as well")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product solve the problem it claims to solve?")]),_v(".")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Test "),_c('mark',[_v("based on the Developer Guide")]),_v(" (Appendix named "),_c('em',[_v("Instructions for Manual Testing")]),_v(") "),_c('mark',[_v("and the User Guide")]),_v(" PDF files.")]),_v(" The testing instructions in the Developer Guide can provide you some guidance but if you follow those instructions strictly, you are unlikely to find many bugs. You can deviate from the instructions to probe areas that are more likely to have bugs."),_c('br'),_v(" "),_c('strong',[_v("If the provided UG/DG PDF files have serious issues")]),_v(" (e.g., some parts seem to be missing), ask prof for permission to use the Web versions of UG/DG instead.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The DG appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(" (if it exists) gives some enhancements the team is planning for the near future. The feature flaws these enhancements address are 'known' -- reporting them will not earn you any credit."),_c('br'),_v("\nHowever, you can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaws")]),_v(" bugs if you think these enhancements themselves are flawed/inadequate."),_c('br'),_v("\nYou can also report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs if any of the enhancements in this list combines more than one enhancement.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You may do both "),_c('em',[_v("system testing")]),_v(" and "),_c('em',[_v("acceptance testing")])]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("Be careful when copying commands from the UG")]),_v(" (PDF version) to the app as some PDF viewers can affect the pasted text. If that happens, you might want to open the UG in a different PDF viewer."),_c('br'),_v("\nIf the command you copied spans multiple lines, check to ensure the line break did not mess up the copied command.")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"c-what-bugs-to-report"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("c) What bugs to report?")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#c-what-bugs-to-report","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("You may report functionality bugs, UG bugs, and feature flaws.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You can also post suggestions on how to improve the product."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Be diplomatic when reporting bugs or suggesting improvements. For example, instead of criticising the current behavior, simply suggest alternatives to consider.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Report functionality bugs:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Do not post suggestions but if the product is missing a critical functionality that makes the product less useful to the intended user, it can be reported as a bug of type "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Type.FeatureFlaw")]),_v(". The dev team is allowed to reject bug reports framed as mere suggestions or/and lacking in a convincing justification as to why the omission or the current design of that functionality is problematic.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You may also report documentation bugs (UG bugs in particular) but keep in mind that there is another time (i.e., part II) set aside for reporting documentation bugs too.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p')])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"d-how-to-report-bugs"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("d) How to report bugs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#d-how-to-report-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Post bugs as you find them")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not wait to post all bugs at the end)")]),_v(" because "),_c('span',{staticClass:"text-danger"},[_v("bug reports created/updated after the allocated time will not count.")]),_v(" Even minor updates (such as changing a label) outside the allowed time window will invalidate that bug.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Launch CATcher, and login to the correct profile (when CATcher asks, consent to creating a new repo):\n"),_c('ul',[_c('li',[_v("PE Dry Run: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE Dry run")])]),_v(" "),_c('li',[_v("PE: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")])])])]),_v(" "),_c('li',[_v("Post bugs using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("If you encounter a 'Failed to fetch' error")]),_v(" during CATcher login, try again. If it still fails, try a different network e.g., your mobile phone's hotspot.")]),_v(" "),_c('li',[_c('strong',[_v("If GitHub prompts you to 're-authorize' CATcher")]),_v(" (this happens if GitHub detects a rush of login requests from the same account), just re-authorize as requested.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('p',[_v("If you 'warmed up' CATcher for the PE earlier, you should already have a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" in your GitHub account, created by CATcher during that warming up. If that is not the case, create a repo to post your bug reports as given in the panel below:")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Creating a repo to post PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Post bug reports in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" repo.")]),_v(" "),_c('li',[_v("The whole description of the bug should be in the issue description i.e., "),_c('mark',[_v("do not add comments to the issue")]),_v(".")]),_v(" "),_c('li',[_v("Choose exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label and exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.severity")]),_v(" label.")])])],1)])],1)],1),_v(" "),_c('h6',{attrs:{"id":"e-bug-report-format"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("e) Bug report format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#e-bug-report-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Each bug should be a separate issue "),_c('span',{staticClass:"dimmed"},[_v("i.e., do not report multiple problems in the same bug report.")]),_c('br'),_v("\nIf there are multiple bugs in the same report, the dev team will select only one of the bugs in the report and discard the others.")]),_v(" "),_c('li',[_v("When reporting similar bugs, it is safer to report them as separate bugs because there is no penalty for reporting duplicates while putting multiple bugs in the same report can reduce your bug count (see the previous point). But as submitting multiple bug reports take extra time, if you are quite sure they will be considered as "),_c('em',[_v("duplicates")]),_v(" by the dev team later, you can report them together, to save time.")]),_v(" "),_c('li',[_v("Write good quality bug reports; "),_c('mark',[_v("poor quality or incorrect bug reports will not earn credit")]),_v("."),_c('br'),_v("\nRemember to give enough details for the receiving team to reproduce the bug. If the receiving team cannot reproduce the bug, you will not be able to get credit for it.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Reminder: Qualities of a good bug report")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has a descriptive title")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has enough details e.g., "),_c('mark',[_v("steps to reproduce, expected, actual, and screenshots")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("severity/type labels chosen are not too far off")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("is written in a non-confrontational tone")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" label to the bug report. Bug reports without a severity label are considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" (lower severity bugs earn lower credit)"),_c('br')])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label to the issue.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)]),_v(" "),_c('ul',[_c('li',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("If you need to include "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(" symbols in your bug report")]),_v(", you can either use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\")]),_v(" to escape them (i.e., use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\>")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x \\< y")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x < y")]),_v(") or wrap it inside back-ticks."),_c('br'),_v("\nReason: CATcher and GitHub strips out content wrapped in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(", for security reasons.")])])],1)],1),_v(" "),_c('p',[_c('mark',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("When in doubt, choose the lower severity:")])]),_v(" If the severity of a bug seems to be smack in the "),_c('em',[_v("middle")]),_v(" of two severity levels, choose the lower severity (unless much closer to the higher one than the lower one).")]),_v(" "),_c('ul',[_c('li',[_v("Reason: The teaching team follow the same policy when adjudicating disputed severity levels in the last phase\nof the PE.")]),_v(" "),_c('li',[_v("As the tester, you might feel like you are throwing away marks by choosing a lower priority; but the lower\npriority has a lower risk of being disputed by the dev team, giving you (and the dev team)\na better chance of earning bonus marks for accuracy (which will be substantial)."),_c('br'),_v("\nTo make your case stronger, state in the bug report why you think the bug might even qualify for a higher severity, while you actually chose the lower one.")]),_v(" "),_c('li',[_v("In this section, there will be a "),_c('em',[_v("mass identity check")])])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":"","id":"identity-check-info","tags":"m--cs2103"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Mass identity check")])])]},proxy:true}])},[_v(" "),_c('p',[_v("When the invigilator announces an identity check,")]),_v(" "),_c('ol',[_c('li',[_v("remove mask (if any)")]),_v(" "),_c('li',[_v("turn towards the camera")]),_v(" "),_c('li',[_v("move closer to the camera (but do not adjust the camera position) -- no need to show the student card")]),_v(" "),_c('li',[_v("hold that pose until the invigilator has taken a screenshot and asks you to go back to the PE activity.")])]),_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_v("Please comply quickly")]),_v(" as non-compliance can delay the PE for everyone. This is expected to take no more than 15 seconds.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Some students will be testing less/more buggy products than others? Isn't that unfair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("As each product is tested by 4-5 testers, after all PE bugs have been finalized, we know how 'buggy' each product is. We then use that information for calculating your PE-related marks. So, the marks are calibrated to match the bugginess of the product you tested.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested has hardly any bugs?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("If the total bugs found (by "),_c('em',[_v("all")]),_v(" testers) in a product is below a certain level, we compensate those testers by increasing the weightage given to PE-D performance, and their dev-testing results.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested is very buggy? Am I expected to find all those bugs")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No. Given the PE has only a short time, we don't expect you to find "),_c('em',[_v("all")]),_v(" bugs in the product. To get full marks, you only need to report a certain percentage of the bugs (e.g., half), or a certain quantity of bugs (the quantity also factors in the nature of the bug e.g., severity), whichever is lower.")])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-ii-evaluating-documents-30-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part II")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Evaluating Documents [30 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-ii-evaluating-documents-30-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use this slot mainly to report documentation bugs")]),_v(" (but you may report product bugs too). You may report bugs related to the UG and the DG."),_c('br'),_v("\nOnly the content of the UG/DG PDF files (not the online version) should be considered.")]),_v(" "),_c('li',[_c('strong',[_v("For each bug reported, cite evidence and justify.")]),_v(" For example, if you think the explanation of a feature is too brief, explain what information is missing and why the omission hinders the reader."),_c('br'),_v("\nDo not report bugs that are not contained within in the UG and DG pdf files (e.g., bugs in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("You may visit the team's project on GitHub during this portion")]),_v(", for the purpose of verifying the accuracy of documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., to check if a diagram matches the code")]),_v(". You are also allowed to download and open the team's code in a code editor.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You "),_c('em',[_v("may")]),_v(" report grammar issues")]),_v(" as bugs but note that minor grammar issues that don't hinder the reader are allowed to be categorized as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" (by the receiving team) -- such bugs earn only small amount or credit for the tester (hence, do not waste time reporting too many minor grammar errors).")])])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iii-overall-evaluation-15-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part III")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Overall Evaluation [15 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iii-overall-evaluation-15-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("To be submitted via TEAMMATES. You are expected to complete this during the PE session itself, but "),_c('mark',[_v("you have until the end of the day to submit (or revise) your submissions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("If you have to valid reason to leave the PE early")]),_v(" (e.g., having another exam right after the PE), you may leave after part II has ended and do part III later -- but note that if you fail to submit this by the hard deadline (i.e., end of the day), you will receive an "),_c('span',{staticClass:"text-danger"},[_v("automatic penalty")]),_v(".")]),_v(" "),_c('li',[_v("The TEAMMATES email containing the submission link should have reached you the day before the PE. If you didn't receive it by then, you can request it to be resent from "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("this page")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If TEAMMATES submission page is slow/fails to load")]),_v(" (all of you accessing it at the same time is likely to overload the server), wait 3-5 minutes and try again. "),_c('span',{staticClass:"text-danger"},[_v("Do not refresh the page repeatedly")]),_v(" as that will overload the server even more, and recovery can take even longer.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"peek":"","panelId":"important-questions-included-in-the-evaluation"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"important-questions-included-in-the-evaluation"}},[_v("Important questions included in the evaluation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#important-questions-included-in-the-evaluation","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"projectGrading-featureFit-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-userGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-devGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-effort-instructions"}},[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])]),_v(" "),_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("[Optional] Concerns or any noteworthy observations about the product you evaluated")])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Finally, what did you like about the product you tested?")])],1)])]),_v(" "),_c('p')],1),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iv-trimming-bugs-half-a-day"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part IV")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Trimming bugs [~half a day]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iv-trimming-bugs-half-a-day","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("This segment gives testers a second chance revisit their bug reports, and choose upto 7 bugs that they wish to send to the dev team.")]),_v(" They will be allowed to change bug type/severity too (but will not be allowed to change bug title or the description)."),_c('br'),_v("\nObjectives:\n"),_c('ul',[_c('li',[_v("Testers can correct their type/severity choices in case they chose incorrectly during the PE due to time pressure.")]),_v(" "),_c('li',[_v("Testers get a chance to withdraw lower impact (or uncertain) bugs so that there is less work for the dev team during the next phase.")])])]),_v(" "),_c('li',[_c('strong',[_v("Procedure:")]),_v(" coming soon ...")])]),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-2-developer-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 2: Developer Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-2-developer-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")]),_c('p'),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Mon, Nov 18th 2359")])]),_v(" "),_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_c('strong',[_v("Yes, that can be better!")])]),_v(" For each bug report you receive, if you think a software engineer who takes pride in their own work would say \"yes, that can be better!\", accept it graciously, even if you can come up with "),_c('em',[_v("some")]),_v(" argument to justify the current behavior. "),_c('br'),_v("\nEven when you still want to defend the current behavior, instead of pretending that the behavior was a deliberate choice to begin with, you can say something like,")]),_v(" "),_c('blockquote',[_c('p',[_v("\"Thanks for raising this. Indeed, it didn't occur to us. But now that we have thought about it, we still feel ...\"")])]),_v(" "),_c('p',[_c('strong',[_c('em',[_v("Some")]),_v(" bugs are 'expected'.")]),_v(" Given the short time you had for the tP and your inexperience in SE team projects, this work is not expected to be totally bug free. The grading scheme factors that in already -- i.e., your grade will not suffer if you accept a few bugs in this phase.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >60% substantial bonus if >80%) of bugs are "),_c('em',[_c('strong',[_v("accepted as triaged")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(" of the bug match the ones you chose).")])]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("It's not bargaining!")])]),_v(" "),_c('p',[_v("When the tester and the dev team cannot reach a consensus, the teaching team will select either the dev team position or the tester position as the final state of the bug, whichever appear to be closer to being reasonable. "),_c('span',{staticClass:"text-danger"},[_v("The teaching team will not come up with our own position, or choose a middle ground.")])]),_v(" "),_c('p',[_v("Hence, do not be tempted to argue for an unreasonable position in the hope that you'll receive something less than asked but still in your favor e.g., if the tester chose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" but you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(", don't argue for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" in the hope that the teaching team will decide a middle ground of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(". It's more likely that the teaching team will choose the tester's position as yours seems unreasonable.")]),_v(" "),_c('p',[_v("More importantly, this is not a bargaining between two parties; it's "),_c('strong',[_v("an attempt to determine the true nature of the bug, and your ability to do so (which is an important skill)")]),_v(".")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('mark',{staticClass:"text-success"},[_c('strong',[_v("Favor "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" over "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")])])])]),_v(" "),_c('p',[_v("If there is even the slightest chance that the change directly suggested (or indirectly hinted at) by a bug report is an improvement that you "),_c('em',[_v("might")]),_v(" consider doing in a future version of the product, choose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v("."),_c('br'),_v("\nChoose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" only for bug reports that are clearly incorrect (e.g., the tester misunderstood something)."),_c('br'),_v("\nAccordingly, it is typical a team to have a lot more "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs and very few "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" bugs.")]),_v(" "),_c('p',[_v("Note that "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs earn a small amount of credit for the tester without any penalty for the dev team, unless there is an unusually high number of such bugs for a team.")])]),_v(" "),_c('p',[_v("Bug reviewing is recommended to be done as a team as some of the decisions need team consensus.")]),_v(" "),_c('box',[_c('p',[_c('strong',[_v("Instructions for Reviewing Bug Reports")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Don't freak out if there are a lot of bug reports.")]),_v(" Many can be duplicates and some can be "),_c('em',[_v("false positives")]),_v(". In any case, we anticipate that all of these products will have some bugs and our penalty for bugs is not harsh. Furthermore, it depends on the severity of the bug. Some bug may not even be penalized.")]),_v(" "),_c('li',[_c('strong',[_v("Nit-picking is a good sign")]),_v(": If you receive a lot of nit-picking type of bugs that make you roll your eyes, it means testers were unable to find more serious bugs. That's a good thing.")]),_v(" "),_c('li',[_c('strong',[_v("Not exactly zero-sum")]),_v(": As mentioned earlier, the penalty for having a specific bug is not the same as the reward for reporting that bug (it's not a "),_c('em',[_v("zero-sum")]),_v(" game). For example, the reward for testers will be higher (because we don't expect the products to have that many bugs after they have gone through so much prior testing)")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Penalty for a minor bug (e.g., "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("an indicative value only; the actual value depends on the severity, type, and the number of assignees")]},proxy:true}])},[_v("-0.15")]),_v(") is unlikely to make a difference in your final grade")],1),_v(", especially given that the penalty applies only if you have more than a certain amount of bugs."),_c('br')]),_v(" "),_c('p',[_v("For example, in a typical case a developer might be assigned 5+ "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" bugs before the penalty even starts affecting their marks.")]),_v(" "),_c('p',[_v("Accordingly, we hope you'll "),_c('strong',[_v("accept bug reports graciously")]),_v(" (rather than fight tooth-and-nail to reject "),_c('em',[_v("every")]),_v(" bug report received) if you think the bug is within the ballpark of 'reasonable'. Those minor bugs are really not worth stressing/fighting over.")])]),_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"info"},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-hard-hat",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("CATcher does not come with a UG, but the UI is fairly intuitive (there are tool tips too). Do post in the forum if you need any guidance with its usage.")]),_v(" "),_c('li',[_v("Tip: If you think others might be editing the same issues at the same time, use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Sync")]),_v(" button at the top to force-sync your view with the latest data from GitHub.")])])]),_v(" "),_c('ul',[_c('li',[_v("Go to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher Web app")]),_v(", and login to the profile "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(". It will show all the bugs assigned to your team, divided into three sections:\n"),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" - Issues that your team has not processed yet.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Responded")]),_v(" - Your job is to get all issues to this category.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Faulty Issues")]),_v(" - e.g., Bugs marked as duplicates of each other, or causing circular "),_c('em',[_v("duplicate")]),_v(" relationships. Fix the problem given so that no issues remain in this category.")])])]),_v(" "),_c('li',[_v("Respond to the bug reports shown.")])])],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',{attrs:{"id":"warning-use-catcher"}},[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug seems to be for a different product")]),_v(" (i.e. wrongly assigned to your team), let us know ASAP.")]),_v(" "),_c('li',[_c('strong',[_v("If the bug is reported multiple times")]),_v(",\n"),_c('ul',[_c('li',[_v("Mark "),_c('span',{staticClass:"text-danger"},[_v("all copies "),_c('mark',[_v("EXCEPT one")])]),_v(" as duplicates of the one left out (let's call that one the "),_c('em',[_v("original")]),_v(") using the "),_c('span',{staticClass:"fas fa-check-square",attrs:{"aria-hidden":"true"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A Duplicate of")]),_v(" tick box.")]),_v(" "),_c('li',[_v("For each group of duplicates, all duplicates should point to one "),_c('em',[_v("original")]),_v(" i.e., no multiple levels of duplicates, and no cyclical duplication relationships.")]),_v(" "),_c('li',[_v("If the duplication status is eventually accepted, all duplicates will be assumed to have inherited the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" from the "),_c('em',[_v("original")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("If you cannot reproduce the bug based on the info given by the tester")]),_v(" you are still expected to make a "),_c('em',[_v("reasonable attempt")]),_v(" to go beyond the information provided by the tester to reproduce the bug, if there is clear evidence of something wrong."),_c('br'),_v("\nFor example, the screenshot in the bug report clearly shows an error message that should not appear, but you can't reproduce the error message based on the info given by the tester. Perhaps the error was caused by something else the tester did although the tester didn't realize it is connected to the error. In this case, based on the error message, you might be in a better position to figure out the real cause of the error. If you don't, the decision can go against you in a later phase if either the tester or the moderator figures out how to reproduce the error and the moderator decides that it is something you should have been able to figure out yourself.")])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Apply one of these labels")]),_v(" (if missing, we assign: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(")")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',[_v("Response")]),_v(" Labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(": You accept it as a valid bug.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(": It is a valid issue, but fixing it is less important than the work done in the current version of the product "),_c('span',{staticClass:"dimmed"},[_v("e.g., it was not related to features delivered in v1.6 or lower priority than the work already done in v1.6")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Rejected")]),_v(": What tester treated as a bug is in fact the "),_c('em',[_v("expected")]),_v(" and "),_c('em',[_v("correct")]),_v(" behavior (from the user's point of view), or the tester was mistaken in some other way. "),_c('span',{staticClass:"dimmed"},[_v("Note: Disagreement with the bug severity/type given by the tester is not a valid reason to reject the bug.")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.CannotReproduce")]),_v(": You are unable to reproduce the behavior reported in the bug after multiple tries.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.IssueUnclear")]),_v(": The issue description is not clear. Don't post comments asking the tester to give more info. The tester will not be able to see those comments because the bug reports are anonymous.")])]),_v(" "),_c('p',[_v("Only the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(" bugs are counted against the dev team. While "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" are not counted against the dev team, they can earn a small amount of consolation marks for the tester. The other three do not affect marks of either the dev team or the tester, except when calculating bonus marks for accuracy.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original bug type assigned to the bug")]),_v(", you may change it to the correct type.")])]),_v(" "),_c('div',{staticClass:"indented",attrs:{"id":"type-labels"}},[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1),_v(" "),_c('p',[_c('strong',[_v("If a bug fits multiple types "),_c('em',[_v("equally")]),_v(" well")]),_v(", the team is free to choose the one they think the best match, but keep the type chosen by the tester if it is one of the types that fits the bug equally well.")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original severity assigned to the bug")]),_v(", you may change it to the correct level.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you need the teaching team's inputs when deciding on a bug")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., if you are not sure if the UML notation is correct)")]),_v(", post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". Remember to "),_c('mark',[_v("quote the issue number shown in CATcher")]),_v(" (it appears at the end of the issue title)."),_c('br'),_v("\nKeep in mind that the bug triaging accuracy affects your marks, and therefore, the teaching team prefers not to dictate a specific response, type, or severity for a particular bug report (i.e., that decision should be yours). Nevertheless, we can provide some general comments relevant to the issue at hand. Additionally, we encourage other students to chime in with their opinions, as such discussions have learning value.")])]),_v(" "),_c('div',{staticClass:"indented-level1",attrs:{"id":"additionalGuidelinesForBugTriaging"}},[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-2"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-2"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-2"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-2"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide who should take responsibility for the bug")]),_v(". Use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Assignees")]),_v(" field to assign the issue to that person(s). There is no need to actually fix the bug though. It's simply an indication/acceptance of responsibility. "),_c('strong',[_v("If there is no assignee, we will distribute the penalty for that bug (if any) equally among all team members")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., if the penalty is -0.4 and there are 4 members, each member will be penalized -0.1")]),_v(".\n"),_c('ul',[_c('li',[_v("If it is not easy to decide the assignee(s), we recommend (but not enforce) that the feature owner should be assigned bugs related to the feature, Reason: The feature owner should have defended the feature against bugs using automated tests and defensive coding techniques.")]),_v(" "),_c('li',[_v("It is also fine to not assign a bug to anyone, in which case the penalty will be divided equally among team members.")])])])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_v("As far as possible, "),_c('mark',[_c('strong',[_v("choose the correct "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(", assignees, and duplicate status even for bugs you are not accepting")])]),_v(". Reason: your "),_c('em',[_v("non-acceptance")]),_v(" may be rejected in a later phase, in which case we need to grade it as an accepted bug."),_c('br'),_v(" "),_c('strong',[_v("If a bug's 'duplicate' status was rejected later")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., the tester says it is not really a duplicate and the teaching team agrees with the tester)")]),_v(", it will inherit the response/type/severity/assignees from the 'original' bug that it was claimed to be a duplicate of.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Justify your response.")]),_v(" For all the following cases, "),_c('mark',[_v("you must add a comment justifying your stance")]),_v(". Testers will get to respond to all those cases and will be considered by the teaching team in later phases (when resolving disputed bug reports)."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" If you don't provide a justification and the tester disagrees with your decision, the teaching team will have no choice but to rule in favor of the tester.")]),_v(" "),_c('ul',[_c('li',[_v("downgrading severity")]),_v(" "),_c('li',[_v("non-acceptance of a bug")]),_v(" "),_c('li',[_v("changing the bug type")]),_v(" "),_c('li',[_v("non-obvious duplicate")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Do we need to justify even if we accept the bug "),_c('em',[_v("as is")]),_v("?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No need to provide a justification if you accept the bug without "),_c('em',[_v("any")]),_v(" changes to it.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: So, those who write more code will be hit with more bugs? How's that fair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Penalty for bugs is applied based on bug "),_c('em',[_v("density")]),_v(", not bug count. For example, if Ann contributed twice as much implementation effort as Tom, and was assigned twice as many bugs as Tom, both will receive similar penalties, as both had similar bug densities.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug is real but the tester used the wrong label (e.g., used the wrong "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v("). Can we reject that bug?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("A bug is a bug irrespective of the label used. Instead of rejecting, rectify the label.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug the tester reported is legit but the expected behavior tester suggested is not correct?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You should accept the bug but state that you disagree with the expected/suggested behavior. Reason: the main job of the tester is to detect bugs; suggesting a solution is optional.")])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_v("You can also refer to the below guidelines:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-2"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-3-tester-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 3: Tester Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-3-tester-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")]),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Start:")]),_v(" Within 1 day after Phase 2 ends."),_c('br')]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" While you are waiting for Phase 3 to start, comments will be added to the bug reports in your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/pe")]),_v(" repo, to indicate the response each received from the receiving team. "),_c('span',{staticClass:"text-danger"},[_v("Please do not edit any of those comments or reply to them via the GitHub interface.")]),_v(" Doing so can invalidate them, in which case the grading script will assume that you agree with the dev team's response. Instead, wait till the start of the Phase 3 is announced, after which you should use CATcher to respond.")])]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Thu, Nov 21st 2359")])]),_v(" "),_c('ul',[_c('li',[_v("In this phase you will get to state whether you agree or disagree with the dev team's response to the bugs you reported. If a bug reported has been subjected to any of the below by the dev team, you can record your objections and the reason for the objection.\n"),_c('ul',[_c('li',[_v("not accepted")]),_v(" "),_c('li',[_v("severity downgraded")]),_v(" "),_c('li',[_v("bug type changed")]),_v(" "),_c('li',[_v("bug flagged as duplicate "),_c('span',{staticClass:"dimmed"},[_v("(Note that you still get credit for bugs flagged as duplicates, unless you reported both bugs yourself. Nevertheless, it is in your interest to object to incorrect duplicate flags because when a bug is reported by more testers, it will be considered an 'obvious' bug and will earn slightly less credit than otherwise)")])])])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_v("Don't feel upset if the dev team did not totally agree")]),_v(" with most of the bugs you reported. That is to be expected, given you had very short time to make those bug decisions while the dev team had a lot more time to deliberate about them. Some may have given unreasonable (in your opinion) arguments against your bug reports; not to worry, just give your counter-arguments and leave it to the teaching team to decide (in the next phase) which position is more reasonable.")]),_v(" "),_c('p',[_v("However, "),_c('mark',[_v("if the dev team's argument is not too far from 'reasonable', "),_c('strong',[_v("it may be better to agree than disagree")])]),_v("."),_c('br'),_v("\nReason: an incorrect counterargument at this phase will lower your "),_c('em',[_v("accuracy")]),_v(" more than an incorrect decision made during the testing phase (because you now have more time to think about the bug) i.e., changing your position after you had more time to think of it and after having seen more information is encouraged, compared to sticking to your initial position 'no matter what'.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you would like to revise your own initial type/severity")]),_v(" in response to the team's inputs, you can state that in your explanation "),_c('span',{staticClass:"dimmed"},[_v("e.g., you rated the bug "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" and the team changed it to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" but now you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")])]),_v(" (do not change the original labels yourself though).")]),_v(" "),_c('li',[_v("You can also refer to the below guidelines, mentioned during the previous phase as well:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" PE → Phase 2 → Additional Guidelines for Bug Triaging")])]},proxy:true}])},[_v(" "),_c('div',[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging-2"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging-2"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging-2","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-3"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-3"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-3"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-3"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1)])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-3"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("If the dev team disagreed with an aspect (i.e., type/severity/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., accept vs not accept")]},proxy:true}])},[_v("validity")]),_v(") and you now agree with the dev team's position, it will not hurt your accuracy rating. Here are some examples (for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v("):")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Tester choice")]),_v(" "),_c('th',[_v("Dev choice")]),_v(" "),_c('th',[_v("Tester reaction")]),_v(" "),_c('th',[_v("Teacher decision")]),_v(" "),_c('th',[_v("Dev accuracy")]),_v(" "),_c('th',[_v("Tester accuracy")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_v("no effect")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low ")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])])])])])])]),_v(" "),_c('ul',[_c('li',[_v("If you do not respond to a dev response, we'll assume that you agree with it.")]),_v(" "),_c('li',[_v("Procedure:")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("When the phase has been announced as open, login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher"}},[_v("CATcher")]),_v(" as usual (profile: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(").")]),_v(" "),_c('li',[_v("For each issue listed in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" section:\n"),_c('ul',[_c('li',[_v("Click on it to go to the details, and read the dev team's response.")]),_v(" "),_c('li',[_v("If you disagree with any of the items listed, tick on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("I disagree")]),_v(" tick box and enter your justification for the disagreement, and click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(".")]),_v(" "),_c('li',[_v("If you are fine with the team's changes, click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(" without any other changes upon which the issue will move to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issue Responded")]),_v(" section.")])])]),_v(" "),_c('li',[_v("No action is required for the bugs the team accepted "),_c('em',[_v("exactly as you reported them")]),_v(" (i.e., no change to type or severity). They are shown in CATcher for your reference only.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1)],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the team rejected my bug report without giving a reason?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You can disagree with the rejection, and the teaching team will likely rule in your favor in the next phase.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Can I add more information about the bug when I object to a dev team's response?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Yes, you may. Given that the dev team did not get to see this addition info when they triaged the bug, the weight such additional info add to your case is lower than if you had that info in the initial bug report. Nevertheless, it can still help your cause, especially if the dev team should have thought about that info on their own, even if they were missing in the initial bug report.")])]),_v(" "),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-4-tutor-moderation"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 4: Tutor Moderation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-4-tutor-moderation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")])],1)])],1),_c('p')]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("6")])],1)],1),_v(" "),_m(30),_v(" "),_m(31),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600","onclick":"event.stopPropagation()"}})]),_v(" "),_m(32),_v(" "),_c('p'),_v(" "),_c('div')])]),_v(" "),_c('br'),_v(" "),_m(33)])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-week-13-public-release-v1-6"}},[_v("tP Week 13: Public release → v1.6 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-13"}},[_v("Intro to tP Week 13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-fix-pe-d-bugs"}},[_v("1 Fix PE-D bugs‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-submit-final-deliverables-tue-nov-12th-14-00"}},[_v("2 Submit final deliverables Tue, Nov 12th 14:00‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-prepare-for-the-practical-exam"}},[_v("3 Prepare for the practical exam‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-ensure-the-code-is-reposense-compatible"}},[_v("4 Ensure the code is RepoSense-compatible‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_v("5 Attend the practical exam Fri, Nov 15th 1600-1800‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_v("6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(34)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"site-nav","tag-name":"nav","to":"site-nav"}},[_c('div',{staticClass:"site-nav-top"},[_c('div',{staticClass:"font-weight-bold mb-2",staticStyle:{"font-size":"1.25rem"}},[_v("Admin info")])]),_v(" "),_c('div',{staticClass:"nav-component slim-scroll"},[_c('div',[_c('site-nav',[_c('overlay-source',{staticClass:"site-nav-list site-nav-list-root",attrs:{"tag-name":"ul","to":"mb-site-nav"}},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseOverview.html"}},[_v("Course Overview")])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/usingThisWebsite.html"}},[_c('mark',[_v("Using this Website")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseExpectations.html"}},[_v("Course Expectations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Course Structure \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('small',[_v("Course Briefing Videos")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/weeklySchedule.html"}},[_c('small',[_v("Weekly Schedule")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/lectures.html"}},[_c('small',[_v("Weekly Briefings")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_c('small',[_v("Tutorials")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/instructors.html"}},[_v("Instructors")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/textbooks.html"}},[_v("Textbooks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/programmingLanguages.html"}},[_v("Programming Language")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/standardsAndConventions.html"}},[_v("Standards/Conventions")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Individual Project (iP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-overview.html"}},[_c('small',[_v("iP (Individual Project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w2.html"}},[_c('small',[_v("iP: Week 2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w3.html"}},[_c('small',[_v("iP: Week 3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w4.html"}},[_c('small',[_v("iP: Week 4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w5.html"}},[_c('small',[_v("iP: Week 5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w6.html"}},[_c('small',[_v("iP: Week 6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w7.html"}},[_c('small',[_v("iP: Week 7")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-w8.html"}},[_c('small',[_v("iP: Week 8")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/ip-grading.html"}},[_c('small',[_v("iP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Team Project (tP)\n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-overview.html"}},[_c('small',[_v("tP (team project): Overview")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-expectations.html"}},[_c('small',[_v("tP: Expectations")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-timeline.html"}},[_c('small',[_v("tP: Timeline")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_c('small',[_v("tP: Constraints")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-teams.html"}},[_c('small',[_v("tP: Forming Teams")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w3.html"}},[_c('small',[_v("tP Week 3: Kickoff")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w4.html"}},[_c('small',[_v("tP Week 4: Set direction")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w5.html"}},[_c('small',[_v("tP Week 5: Gather requirements")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w6.html"}},[_c('small',[_v("tP Week 6: Define the MVP")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w7.html"}},[_c('small',[_v("tP Week 7: Practice iteration → v1.1")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w8.html"}},[_c('small',[_v("tP Week 8: First feature increment → v1.2")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w9.html"}},[_c('small',[_v("tP Week 9: MVP → v1.3")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w10.html"}},[_c('small',[_v("tP Week 10: Alpha version → v1.4")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w11.html"}},[_c('small',[_v("tP Week 11: Release candidate → v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w12.html"}},[_c('small',[_v("tP Week 12: Extra week for v1.5")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-w13.html"}},[_c('small',[_v("tP Week 13: Public release → v1.6")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('small',[_v("tP: Deliverables")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-ped.html"}},[_c('small',[_v("tP: Practical Exam Dry Run")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-pe.html"}},[_c('small',[_v("tP: Practical Exam")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('small',[_v("tP: Grading")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tp-supervision.html"}},[_c('small',[_v("tP: Supervision/Guidance")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/peerEvaluations.html"}},[_v("Peer Evaluations")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/tools.html"}},[_v("Tools")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-info"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("3")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/exams.html"}},[_v("Exams")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/participation.html"}},[_v("Participation Marks")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/gradeBreakdown.html"}},[_v("Grade Breakdown")]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-0",attrs:{"onclick":"handleSiteNavClick(this)"}},[_v("Appendices \n\n"),_c('div',{staticClass:"site-nav-dropdown-btn-container"},[_c('i',{staticClass:"site-nav-dropdown-btn-icon site-nav-rotate-icon",attrs:{"onclick":"handleSiteNavClick(this.parentNode.parentNode, false); event.stopPropagation();"}},[_c('span',{staticClass:"glyphicon glyphicon-menu-down",attrs:{"aria-hidden":"true"}})])])]),_c('ul',{staticClass:"site-nav-dropdown-container site-nav-dropdown-container-open site-nav-list"},[_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixA-principles.html"}},[_c('small',[_v("Apdx A: Course Principles")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixB-policies.html"}},[_c('small',[_v("Apdx B: Course Policies")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixC-faq.html"}},[_c('small',[_v("Apdx C: FAQ")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixD-help.html"}},[_c('small',[_v("Apdx D: Getting Help")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-warning"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("2")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixE-gitHub.html"}},[_c('small',[_v("Apdx E: Using GitHub")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-danger"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("1")])])])])]),_v(" "),_c('li',[_c('div',{staticClass:"site-nav-default-list-item site-nav-list-item-1",attrs:{"onclick":"handleSiteNavClick(this)"}},[_c('a',{attrs:{"href":"/website/admin/appendixF-teamworkIssues.html"}},[_c('small',[_v("Apdx F: Handling Team Issues")])]),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-light text-dark"},[_c('span',{staticClass:"font-weight-bold text-success"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_v("4")])])])])])])])])],1)],1)])]),_v(" "),_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('br'),_v(" "),_m(1),_v(" "),_c('div',{attrs:{"id":"main"}},[_m(2),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(3),_v(" "),_m(4),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"86%","y":"92%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.6")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to put in final touches while minimizing delivery risks "),_c('span',{staticClass:"dimmed"},[_v("i.e., risks of regressions or deadline overruns")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the quality necessary for a public release.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Freeze features. Strictly limit changes to bug fixes only.")])])])])]),_v(" "),_m(5),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of our policy on reuse")]),_v(" (e.g., "),_c('mark',[_v("how to give credit for reused code")]),_v("):")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Policy on reuse "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"policy-on-reuse"}},[_v("Policy on reuse "),_c('small',[_c('small',[_c('span',{staticClass:"badge rounded-pill bg-light text-danger"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#policy-on-reuse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('p',[_c('strong',[_v("Scope:")]),_v(" The policies on reuse apply to all project deliverables that are normally expected to be your own work (i.e., code, code comments, documentation, diagrams, images, etc.) unless stated otherwise.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse is encouraged. However, note that reuse has its own costs")]),_v(" (such as the learning curve, additional complexity, usage restrictions, and unknown bugs). Furthermore, you will not be given credit for work done by others. Rather, you will be given credit for "),_c('em',[_v("reusing")]),_v(" work done by others.")]),_v(" "),_c('ul',[_c('li',[_v("You are allowed to reuse work from your classmates or past students, subject to following conditions:\n"),_c('ul',[_c('li',[_v("The work has been shared publicly by us or the authors.")]),_v(" "),_c('li',[_v("You clearly give credit to the original author(s).")])])]),_v(" "),_c('li',[_v("You are allowed to reuse code from external sources, subject to following conditions:\n"),_c('ul',[_c('li',[_v("You clearly give credit to the original author/source.")]),_v(" "),_c('li',[_v("You do not violate the license under which the work has been released. Please "),_c('strong',[_v("do not use 3rd-party images/audio")]),_v(" in your software unless they have been specifically released to be used freely. Just because you found it in the Internet does not mean it is free for reuse.")])])]),_v(" "),_c('li',[_c('mark',[_v("Always get permission from us before you reuse")]),_v(" third-party libraries. Please post your 'request to use 3rd party library' in our "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". That way, the whole class get to see what libraries are being used by others.\n"),_c('ul',[_c('li',[_v("Our approval is given based on compliance with the course. Compliance with the license of the reused software is entirely your responsibility. While we don't anticipate such a case, any liability from improper reuse of a third-party library is to be borne by the person who reused it (i.e., not NUS).")]),_v(" "),_c('li',[_v("Once a 3rd party library has been approved for one student/team, it can be used freely by others without asking for approval again.")])])])]),_v(" "),_c('div',{attrs:{"id":"cite-reuse-immediately"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Keep track of code reuse")]),_v(" If you reuse/adapt code from elsewhere, cite the source in code immediately. Otherwise you will not remember the source of code reuse later. Not citing the original source can land you in trouble for plagiarism.")])])],1),_v(" "),_c('div',{attrs:{"id":"using-tool-generated-code"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_c('strong',[_v("FAQ: Can I use code generated by AI tools")]),_v(" (e.g., Copilot, ChatGPT)?")]),_c('br'),_v(" "),_c('strong',[_v("Answer:")]),_v(" We don't explicitly prohibit you from using those tools, but we strongly discourage you from using them in a way that hinders your learning. For example,")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Use a tool such as GitHub co-pilot to increase the productivity of writing code (e.g., auto-complete the next bit of code).")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Write the required code yourself, and then, use the tool to generate alternative implementations, compare, and use that experience to improve your own coding skills.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" When troubleshooting/debugging, use a tool to help you locate the problem.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])]),_v(" Give the problem description to the tool and get it to generate the code for you, and use it directly in your submission, and claim it as your own.")])]),_v(" "),_c('p',[_v("Other caveats:")]),_v(" "),_c('ul',[_c('li',[_v("Using such tools can result in your code being same as others in the class. If such code was flagged for plagiarism, \"It was generated by a tool\" will not be a valid excuse. Therefore, if you use (possibly with minor changes) a non-trivial code snippet generated by a tool (e.g., an entire method), it is safer to acknowledge in the code as a case of code reuse.")]),_v(" "),_c('li',[_v("Those tools sometimes can confidently give you the wrong answer. So, have a healthy level of scepticism about the accuracy of the code generated by such tools.")])])])],1),_v(" "),_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Automated plagiarism checks ahead!")]),_v(" We'll be using automated plagiarism checks to detect uncredited reuses of content from other CS2103 tP's i.e., tP's done by other teams in this batch and "),_c('mark',[_c('em',[_v("all")]),_v(" previous batches")]),_v(". These checks will be done "),_c('em',[_v("after")]),_v(" the final submissions. The cases detected will be verified and reported to the university administration for disciplinary action. As you know, NUS enforces a penalty of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("F")]),_v(" grade for the entire course (with no option to S/U or withdraw from the course) for plagiarism offenses.")])]),_v(" "),_c('box',[_c('h4',{attrs:{"id":"giving-credit-for-reused-work"}},[_v("Giving credit for reused work"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#giving-credit-for-reused-work","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Given below are how to give credit for things you reuse from elsewhere. These requirements are specific to this course "),_c('span',{staticClass:"dimmed"},[_v("i.e., not applicable outside the course (outside the course, you should follow the rules specified by your employer and the license of the reused work)")])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("used a third party library")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Individual project (iP): Mention in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README")]),_v(" file (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Team project (tP):\n"),_c('ul',[_c('li',[_v("Mention in the Developer Guide (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Mention in "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-ppp"}},[_v("Project Portfolio Page")]),_v(" if the library has a significant relevance to the features you implemented.")],1)])])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("reused code snippets found on the Internet")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. from StackOverflow answers")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred code in another software")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred project code by current/past student")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If you read the code to understand the approach and implemented it yourself, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("inspired")]),_v(" by https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted code from elsewhere but modified it significantly, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("adapted")]),_v(" from https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted a non-trivial code block (possibly with minor modifications "),_c('span',{staticClass:"dimmed"},[_v("renaming, layout changes, changes to comments, etc.")]),_v("), also mark the code block as reused code (using "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-authorTags"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(" with the "),_c('mark',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-reused")])]),_v(" suffix)"),_c('br'),_v("\nFormat:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" {yourGithubUsername}-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//{Info about the source...}")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v("{"),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_v("Reused "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("code")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(possibly with minor modifications)")]),_v(" here ...}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}}),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])])]),_v("\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example of reusing a code snippet (with minor modifications):"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_v("persons = getList()\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" johndoe-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Reused from https://stackoverflow.com/a/34646172")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// with minor modifications")]),_v("\n")]),_c('span',[_v("Collections.sort(persons, "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("new")]),_v(" Comparator() {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-meta"}},[_v("@Override")]),_v("\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("int")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("compare")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(CustomData lhs, CustomData rhs)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" lhs.customInt > rhs.customInt ? -"),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("1")]),_v(" : "),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("0")]),_v(";\n")]),_c('span',[_v(" }\n")]),_c('span',[_v("});\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" persons;\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])],1)]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('strong',[_v("Giving credit for reused images")]),_v(" (and other media assets): Ideally, the source should be credited where the asset appears. For example, if you reused an image in your GUI, you can credit the source where a screenshot of the GUI showing that image appears first in your user guide. In addition, you can also acknowledge the sources in your GitHub project's landing page (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(")")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB3 code")]),_v(": If your team project code follows a design similar to AB3, that doesn't mean you need to credit AB3 -- this is because a brownfield project is "),_c('em',[_v("expected")]),_v(" to follow existing code/design where possible, in the interest of consistency. This type of reuse need not be acknowledged/credited specifically.")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB4 code")]),_v(": If you reused any code from "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(", cite it as you would cite reuse from any other external source.")])]),_v(" "),_c('p',[_c('strong',[_v("Giving credit for reusing from course materials")]),_v(" (e.g., course textbook, tutorials, instructional resources from se-education.org) is not required, although you are welcome to do so. Reason: Those materials were created by the teaching team for you to use/reuse.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse within the team")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing code written by a team member)")]),_v(" need not be mentioned explicitly. However, you should factor in such reuse when you estimate effort contributed by each team member.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse of documentation")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing a UG/DG section)")]),_v(" is no different from code reuse. Such reuse should be credited as well.")]),_v(" "),_c('p',[_c('strong',[_v("Citing the use of AI-generated/assisted work")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using GitHub Copilot for project work)")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If the use of the tool was localized into a few places "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it to write a few methods/classes only)")]),_v(", cite its use in comments near where you used it.")]),_v(" "),_c('li',[_v("If the use was more widespread "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it as an auto-complete tool during most of your coding)")]),_v(", cite the usage (i.e., which tool, who used it, the extent of use) in the following location instead (i.e., no need to cite in code comments):\n"),_c('ul',[_c('li',[_v("iP: in the README file")]),_v(" "),_c('li',[_v("tP: in the DG, under the Acknowledgements section")])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-authorTags"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project mid-v1.3 (extract) →")]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-ppp"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project → Deliverables → Project Portfolio Page")]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:deliverablesPPP-teamTasks"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Team-Based Tasks")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('em',[_v("Team-tasks")]),_v(" are the tasks that "),_c('em',[_v("someone")]),_v(" in the team has to do.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Examples of team-tasks")])]},proxy:true}])},[_v(" "),_c('span',{attrs:{"id":"example-team-tasks"}},[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])]),_c('p')],1)],1)]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])],1),_c('p')],1)])])],1)])])])],1),_c('p')])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-fix-pe-d-bugs"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(6),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-fix-pe-d-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(7),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("After the PE-D")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-d-after-the-session"}},[_c('span',{staticClass:"badge bg-primary"},[_v("PE-D")]),_v(" "),_c('span',{staticClass:"text-primary"},[_v("After the session")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-d-after-the-session","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The relevant bug reports will be transferred to your issue tracker")]),_v(" within a day after the session is over. Once you have received the bug reports for your product, you can decide whether you will act on reported issues before the final submission v1.6. For some issues, the correct decision could be to reject or postpone to a version beyond v1.6."),_c('br'),_v("\nReminder: There is no penalty for any of the bugs you received in the PE-D.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('box',{attrs:{"type":"info","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-angry",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-info"},[_c('strong',[_v("Dealing with \"What the h___ the tester was thinking?\" type bug reports")])])]),_v(" "),_c('p',[_v("Some bug reports will make you angry because they seem baseless, wrong, rude etc. It's still possible to get value from such bug reports though:")]),_v(" "),_c('ul',[_c('li',[_v("After you got over the initial indignation, dig deeper to see if there's even the slightest possibility that there is a bug. For example, consider this scenario:\n"),_c('ol',[_c('li',[_v("The tester claims a certain command doesn't work.")]),_v(" "),_c('li',[_v("All your team members tried the exact same command and it works as advertised. What the h___ the tester is trying to pull here?")]),_v(" "),_c('li',[_v("In reality, the error is actually caused by a duplicate entry in the database resulting from a previous command; the tester didn't mention that command in the bug report (because s/he didn't realize the two are connected).")])])]),_v(" "),_c('li',[_v("The reported bug might be non-existent but the tester's screw up can indicate other areas to improve. For example, the tester reports a missing feature that is clearly mentioned as 'not implemented' in the UG, but perhaps the UG can be improved to make that fact harder to miss?")]),_v(" "),_c('li',[_v("What exactly about the bug report that makes you angry? Remind yourself not to do the same offence when you report bugs yourself in the future.")])]),_v(" "),_c('p',[_v("Use the pain of dealing with this kind of bug reports as an opportunity to develop the following mindset:")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(a)")]),_c('div',[_c('p',[_c('strong',[_v("The product is "),_c('em',[_v("guilty until proven innocent")])]),_v(": If the bug report has even a "),_c('em',[_v("hint")]),_v(" of something amiss with the product, it's your (not the tester's) responsibility to try and prove if it is really a problem or not. Why? because finding a bug is a win for "),_c('em',[_v("you")]),_v(" -- as you can then fix it and thereby avoid the embarrassment of releasing a buggy product.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(b)")]),_c('div',[_c('p',[_c('strong',[_v("A crappy bug report is better than no bug report")]),_v(": If the bug actually exists, it is better to have "),_c('em',[_v("some")]),_v(" indication about it than none at all. In a real project, a tester that fails to find bugs can cause more harm to your career than a tester who finds bugs but doesn't report them well.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(c)")]),_c('div',[_c('p',[_c('strong',[_v("I "),_c('em',[_v("used")]),_v(" to get angry at bug reports, but not anymore")]),_v(": If you work hard, take pride in the quality of your work, it's no wonder that you get angry when others find faults with your work incorrectly. Aim to move past that phase where you take bug reports personally. The sooner you can tackle any sh*tty bug report calmly and objectively, the sooner you'll rise to the 'professional' software engineer level.")])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you have received stray bug reports")]),_v(" (i.e., bug reports that don't seem to be about your project), do let us know ASAP (email the prof).")]),_v(" "),_c('li',[_c('strong',[_v("You can navigate to the original bug report")]),_v(" (via the back-link provided in the bug report given to you) and post in that issue thread to communicate with the tester who reported the bug "),_c('span',{staticClass:"dimmed"},[_v("e.g. to ask for more info")]),_v(", etc. However, the tester is not obliged to respond. Note that simply replying to the bug report in your own repo will not notify the tester.\n"),_c('ul',[_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Do not argue with the tester to try to convince that person that your way is correct/better. If at all, you can gently explain the rationale for the current behavior but do not waste time getting involved in long arguments. If you think the suggestion/bug is unreasonable, just thank the tester for their view and discontinue to discussion.")])])]),_v(" "),_c('li',[_c('strong',[_v("Aim to "),_c('mark',[_v("do a systematic triaging of issues received")])]),_v(". Some suggestions:\n"),_c('ul',[_c('li',[_v("Close duplicate issues.")]),_v(" "),_c('li',[_v("Use labels (create new labels if necessary) to,\n"),_c('ul',[_c('li',[_v("differentiate "),_c('em',[_v("bugs")]),_v(" from the rest (e.g., feature suggestions/flaws).")]),_v(" "),_c('li',[_v("indicate priority of the bugs that need fixing.")])])]),_v(" "),_c('li',[_v("Assign each bug to the person who should fix it.")])])]),_v(" "),_c('li',[_c('strong',[_v("You may ignore "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type/severity.*")]),_v(" labels given by the tester.")]),_v(" They will not affect you or the tester either way -- they were there just for the testers to practice. You may apply your own type/severity labels if you wish."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" In particular, beware of simply following the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" given by the tester; it is your job to decide the correct type of the issue. e.g., What the tester labeled as a "),_c('em',[_v("bug")]),_v(" might actually be a "),_c('em',[_v("feature flaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report is simply a feature suggestion")]),_v(", you can take note of it and close it (to reduce clutter in the issue tracker, and to make it easy for the teaching team to track your progress on dealing with PE-D issues). Similarly, you can close PE-D issues not relevant to v1.6.")])]),_v(" "),_c('box',{attrs:{"type":"wrong","seamless":""}},[_c('p',[_c('strong',[_v("Note that listing bugs as 'known bugs' in the UG or specifying "),_c('em',[_v("unreasonable")]),_v(" constraints in the UG to make bugs 'out of scope' will not exempt those bugs from the final grading.")]),_v(" That is, PE testers can still earn credit for reporting those bugs and you will still be penalized for them."),_c('br'),_v("\nHowever, a product is allowed to have 'known limitations' "),_c('span',{staticClass:"dimmed"},[_v("(e.g., a daily expense tracking application meant for students is unable to handle expenses larger than $999)")]),_v(" as long as they don't degrade the product's use within the intended scope. They will not be penalized.")])]),_v(" "),_c('box',{attrs:{"type":"info","tags":"m--cs2103","seamless":""}},[_c('p',[_c('strong',[_v("Even bugs inherited from AB3 need to be fixed.")]),_v(" As mentioned in a previous week, even bugs you inherited from AB3 need fixing "),_c('span',{staticClass:"dimmed"},[_v("(because \"we inherited it from the previous dev team\" is not a valid excuse to leave a bug unfixed)")]),_v(". If you are unsure if something is such a bug that need fixing, please post in the forum.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Identify bugs you missed in the PE-D:")]),_v(" Visit the issue tracker of the team you tested and see bugs reported by others who tested the same product. Identify bugs you missed (if any). That knowledge might help you find similar bugs in your own product as well as find more bugs during the PE.")])])],1)])],1),_c('p'),_v(" "),_m(8),_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1),_v(" "),_m(9),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q1: Performance of PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("In this context, a good bug report,")]),_v(" "),_c('ul',[_c('li',[_v("has a descriptive title,")]),_v(" "),_c('li',[_v("has enough details,")]),_v(" "),_c('li',[_v("severity/type labels chosen are not too far off,")]),_v(" "),_c('li',[_v("is written in a non-confrontational tone, and")]),_v(" "),_c('li',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])]),_v(" "),_c('p',[_v("Rate each tester on the following scale:")]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Poor")]),_v(" "),_c('th',[_v("Below expectations")]),_v(" "),_c('th',[_v("Meets expectations")]),_v(" "),_c('th',[_v("Exceeds expectations")]),_v(" "),_c('th',[_v("Greatly exceeds expectations")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("no bug reports from this tester")]),_v(" "),_c('td',[_v("just a few bug reports, and none are good")]),_v(" "),_c('td',[_v("3-5 good bug reports")]),_v(" "),_c('td',[_v("6-8 good bug reports")]),_v(" "),_c('td',[_v("9 or more good bug reports")])])])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q2: Rank PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("Rank the PE-D testers based on their performance (five rank 1 to the top performing tester):")]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester A")]),_v(": rank __"),_c('br'),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester B")]),_v(": rank __"),_c('br'),_v("\n...")])]),_c('p')],1),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_v("PE-D bug titles will be prefixed with tester ID e.g., ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE-D][Tester A] UG does not load")]),_v(") to make it easy for you to "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("using GitHub issue tracker's filters/search box")]},proxy:true}])},[_v("filter")]),_v(" bugs reported by each tester."),_c('br'),_v("\nFurthermore, tester ID mapping (i.e., who is Tester A, Tester B, etc.) will be sent to you via email within 1 day after the PE-D.")],1)])]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-submit-final-deliverables-tue-nov-12th-14-00"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(10),_v(" "),_m(11),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-submit-final-deliverables-tue-nov-12th-14-00","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_m(12),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Penalty for late submission")]),_v(" (per file): "),_c('br'),_v(" "),_c('mark',[_v("-1 mark for missing the deadline (up to 2 hour of delay).")]),_c('br'),_v("\n-2 for an "),_c('em',[_v("extended delay")]),_v(" (up to 24 hours late)."),_c('br'),_v("\nPenalty for delays beyond 24 hours is determined on a case by case basis.\n"),_m(13)]),_v(" "),_m(14),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Follow submission instructions closely")]),_v(". "),_c('mark',[_v("Any non-compliance will be penalized")]),_v(". e.g. wrong file name/format."),_c('br'),_v("\nCanvas might automatically add a file name suffix (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-1.pdf")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-2.pdf")]),_v(", ...) if you upload a file multiple times. You can safely ignore that suffix.")]),_v(" "),_m(15)]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('big',[_c('strong',[_v("Submissions:")])])],1)]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',{attrs:{"id":"tip-how-to-convert-to-pdf"}},[_c('box',{attrs:{"id":"caution-on-pdf-conversion","type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])],1),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Side benefits for early submissions:")]),_v(" Given that "),_c('em',[_v("using buffers to reduce the risk of deadline overruns")]),_v(" is a learning outcome of this course, we strongly encourage setting an internal submission deadline a few hours earlier than the actual deadline. As an incentive, we plan to perform some checks on early submissions and inform you if we found issues with your submission "),_c('span',{staticClass:"dimmed"},[_v("(e.g., incorrect file name/format)")]),_v(", thus giving you a chance to fix them before the deadline and avoid a penalty for it.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("You may use automated tools to improve documentation:")]),_v(" e.g., tools such as Grammarly may be used to improve the writing quality and find grammar errors.")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("The icon "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" indicates team submissions.")]),_v(" Only one person need to submit on behalf of the team but we recommend that others help verify the submission is in order."),_c('br'),_v(" "),_c('mark',[_v("We will not entertain requests to limit late penalties of team submissions to one person")]),_v(" even if the delay was one person's fault. That is, the responsibility (and the penalty) for team submissions are to be shared by the whole team rather than burden one person with it.")])])],1),_v(" "),_m(16),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Executable "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should be an executable jar file")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Should be "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v(" i.e., it can be used by end-users")]},proxy:true}])},[_c('em',[_v("releasable")])])],1),_v(". While some features may be scheduled for later versions, the features in v1.6 should be good enough to make it usable by at least some of the target users.")]),_v(" "),_c('li',[_v("Also note the following constraint:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')])])])],1),_c('p'),_v(" "),_m(17),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Source Code "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should match v1.6 deliverables")]),_v(" i.e., executable, docs, website, etc.")]),_v(" "),_c('li',[_c('strong',[_v("To be delivered as a Git repo.")]),_v(" Ensure your GitHub team repo is updated to match the executable.")])])])])])],1),_c('p'),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_v("Reminder: double-check to ensure the code attributed to you by RepoSense is correct.")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Making the Code RepoSense-Compatible "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_c('ul',[_c('li',[_v("Go to the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tp Code Dashboard")]),_v(". Click on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("")]),_v(" icon against your name and verify that the "),_c('mark',[_v("lines attributed to you (i.e., lines marked as green)")]),_v(" reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines."),_c('br'),_v(" "),_c('img',{attrs:{"src":"/website/admin/images/greenLines.png","width":"600"}})])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("More info on how to make the code RepoSense compatible:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-2"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-2"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_m(18),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → User Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(19),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Developer Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_m(20),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Project Portfolio Page "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])]),_c('p')],1)])])],1),_c('p'),_v(" "),_m(21),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Product Website "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_v("When setting up your team repo, you would be configuring "),_c('strong',[_v("the GitHub Pages feature to publish your documentation")]),_v(" as a website.")]),_v(" "),_c('h4',{attrs:{"id":"website-home-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Home page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-home-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Update to match your product.")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('h4',{attrs:{"id":"website-ui-png"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ui-png","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('mark',[_v("Ensure the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" matches the current product")])])])]),_v(" "),_c('div',{staticClass:"indented-level3",attrs:{"id":"tips-for-product-screenshot"}},[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)]),_v(" "),_c('h4',{attrs:{"id":"website-aboutus-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("AboutUs Page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-aboutus-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use a suitable profile photo.")])])]),_v(" "),_c('div',{staticClass:"indented-level2",attrs:{"id":"profile-photo"}},[_c('p',[_v("The purpose of the profile photo is for the reader to identify you. Therefore, choose a "),_c('mark',[_v("recent individual photo showing your face clearly")]),_v(" (i.e., not too small) -- somewhat similar to a passport photo. Given below are some examples of good and bad profile photos."),_c('br'),_v(" "),_c('pic',{staticStyle:{"width":"365.33px"},attrs:{"eager":"","src":"/website/admin/images/profilephotos.png"}})],1),_v(" "),_c('p',[_v("If you are uncomfortable posting your photo due to security reasons, you can post a lower resolution image so that it is hard for someone to misuse that image for fraudulent purposes. If you are concerned about privacy, you may use "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/File:Portrait_placeholder.png"}},[_v("a placeholder image")]),_v(" in place of the photo in course-related documents that are publicly visible.")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Include a link to each person's PPP page.")])]),_v(" "),_c('li',[_c('strong',[_v("Team member names:")]),_v(" you may use the full name, part of the name, or GitHub username of the team member.")])]),_v(" "),_c('h4',{attrs:{"id":"website-ug-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("UG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ug-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])]),_v(" "),_c('h4',{attrs:{"id":"website-dg-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("DG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-dg-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])])])])])],1),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-prepare-for-the-practical-exam"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(22),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-prepare-for-the-practical-exam","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Overview")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('strong',[_v("PE is not entirely a pleasant experience, but is an essential component")]),_v(" that aims to increase the quality of the tP work, and the rigor of tP grading.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("more details on the motivation and objectives...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The upfront objective of the PE is to increase the rigor of project grading.")]),_v(" Assessing most aspects of the project involves an element of subjectivity. As the project counts for a large percentage of the final grade, it is not prudent to rely on evaluations of tutors alone as there can be significant variations between how different tutors assess projects. That is why we collect more data points via the PE to minimize the chance of your project being affected by evaluator-bias.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates your testing skills")]),_v(", done as the following two-parts:\n"),_c('ol',[_c('li',[_c('strong',[_v("You will be given a chance to find bugs in a different software.")]),_v(" Furthermore, you will be given an opportunity to "),_c('s',[_v("defend your bug reports against any possible objections")]),_v(" interact with the developers (anonymously) to refine the bug report further "),_c('span',{staticClass:"dimmed"},[_v("e.g., correct the severity level if the level you chose initially was incorrect")]),_v(". If you report possible bugs that turn out to be actual bugs, you earn marks (provided the product actually had bugs in the first place).")]),_v(" "),_c('li',[_c('strong',[_v("Your product will be subjected to a rigorous testing")]),_v(" and you will be given a chance to point out any inaccuracies in the bugs reported. You will lose marks for any bugs that turned out to be real bugs, but only if your work has more bugs than a certain bar.")])])]),_v(" "),_c('li',[_c('strong',[_v("The above two can lead to high-rigor, "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("based on how well you achieve the objectives of testing, as opposed to indirect measures such as number of test cases")]},proxy:true}])},[_c('em',[_v("outcome-based")])]),_v(" evaluation of your testing skills")],1),_v(". The alternative is to rely solely on other easy-to-measure metrics "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the number of test cases, test coverage, test LoC etc.)")]),_v(" which we don't think as good representations of your actual testing skills.\n"),_c('strong',[_v("The "),_c('em',[_v("ultimate")]),_v(" objective of the PE is not even the higher rigor of grading.")]),_v(" Because of the PE, you will realize that any bugs are very likely to be detected, which means you will work extra hard to avoid bugs; and THAT is the real benefit. Ultimately, "),_c('span',{staticClass:"text-success"},[_c('strong',[_v("what we want is for you to internalize a higher standard for testing and a lower tolerance for bugs in your own code")])]),_v(" -- something that can have a longer-lasting impact on your future careers, beyond the mere course grade.")]),_v(" "),_c('li',[_c('strong',[_v("Problem: There is no way we can carry out the above-mentioned")]),_v(" two-part evaluation at a high-level of rigor if using tutors as testers, or using an automated testing script. "),_c('span',{staticClass:"dimmed"},[_v("e.g., some tutors might not have the motivation to try hard enough to find bugs, and it will be hard to find tutors willing to spend many hours testing products so near to their own exams.")]),_c('br'),_v(" "),_c('strong',[_v("Solution: Get the two parts of the evaluation to feed each other")]),_v(" by getting student to test each other's products.")]),_v(" "),_c('li',[_c('strong',[_v("The fact that you are testing products created by your classmates and objecting to bugs reported by your classmates can make this a rather 'unpleasant' experience")]),_v(". You might feel like "),_c('em',[_v("being pitted against each other")]),_v(", or as if "),_c('em',[_v("you are forced to bring down each other")]),_v(". But as you read above, it is a necessary evil for this evaluation to be even possible. Given the actual goal is to get you to create products with very few bugs, we think switching off the 'collaborative learning' mode for just a few days is a price worth paying to achieve that goal. After all, the PE is an evaluation activity (not a "),_c('em',[_v("learning activity")]),_v(") and happens "),_c('em',[_v("after")]),_v(" the regular learning period is over.")]),_v(" "),_c('li',[_c('strong',[_v("You are not taking marks from someone else")]),_v(" -- at least, don't think of it that way. The point of contention is 'is this really a bug?' which is independent of the people involved. Furthermore, the reward for detecting a bug and the penalty for having a bug in your code are calculated independently.")]),_v(" "),_c('li',[_c('strong',[_v("Still, "),_c('em',[_v("none of us")]),_v(" likes it when others point out problems of our work")]),_v(". Some of us don't even like pointing out problems of others' work. But "),_c('mark',[_v("we just have to learn not to take bug reports personally")]),_v(". Another important intended outcome is to be able to report bugs in a way that doesn't feel like you are "),_c('em',[_v("attacking")]),_v(" or trying to "),_c('em',[_v("sabotage")]),_v(" the dev team.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates aspects other than testing")]),_v(" e.g., your product evaluation skills, effort estimation skills etc. When evaluating those aspects in particular, they are "),_c('mark',[_v("not graded solely based on peer ratings")]),_v(". Rather, PE data are cross-validated with tutors' grades to identify cases that need further investigation. When peer inputs are used for grading, they are usually combined with tutors' grades with appropriate weight for each. In some cases ratings from team members are given a higher weight compared to ratings from other peers, if that is appropriate.")])])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("The PE is divided into four phases")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 1: Bug Reporting")])]),_v(": "),_c('span',{attrs:{"id":"pe-p1-desc"}},[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part I")]),_v(" "),_c('strong',[_v("Product Testing")]),_v(" [60 minutes] -- to focus on reporting bugs in the product (but can report documentation bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part II")]),_v(" "),_c('strong',[_v("Evaluating Documents")]),_v(" [30 minutes] -- to focus on reporting bugs in the UG and DG (but can report product bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part III")]),_v(" "),_c('strong',[_v("Overall Evaluation")]),_v(" [15 minutes] -- to give overall evaluation of the product, documentation, effort, etc.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part IV")]),_v(" "),_c('strong',[_v("Trimming Bugs")]),_v(" [half a day] -- For testers to select up to 7 bugs to send to the dev team.")])])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 2: Developer Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p2-desc"}},[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 3: Tester Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p3-desc"}},[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-secondary"},[_c('strong',[_v("Phase 4: Tutor Moderation")])]),_v(": "),_c('span',{attrs:{"id":"pe-p4-desc"}},[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")]),_c('br'),_c('br')])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Grading")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Your performance in the practical exam will affect your final grade and your peers', as explained in "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('em',[_v("Admin: Project Grading")])]),_v(" section.")]),_v(" "),_c('li',[_v("As such, we have put in measures to identify and "),_c('mark',[_v("penalize insincere/random evaluations")]),_v(".")]),_v(" "),_c('li',[_v("Also see:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Notes on how marks are calculated for PE "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p')])])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Preparation, Restrictions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-preparation-restrictions"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Preparation, Restrictions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-preparation-restrictions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"pe-mode-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Mode: you can choose between remote or F2F")]),_v(" (we'll use a Canvas survey to collect your preferred mode):\n"),_c('ul',[_c('li',[_c('strong',[_v("Remote mode")]),_v(": This is the "),_c('mark',[_v("recommended mode")]),_v(". Proctored via Zoom. You'll need to join the Zoom session from a quiet place (i.e., conducive to an exam) at which you can set up a Zoom device for proctoring."),_c('br'),_v("\nChoose this mode only if you are able to comply with the Zoom proctoring requirements given further down.")]),_v(" "),_c('li',[_c('strong',[_v("F2F mode")]),_v(": Attend the PE at the lecture venue (UTown-AUD2)."),_c('br'),_v("\nChoose only if you are unable to use the remote mode (reason: higher the number of F2F attendees, higher the risk of Wi-Fi speed issues and GitHub throttling issues).")])])])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Those opting for the F2F mode can ignore any Zoom-related points")]),_v(" in the instructions below.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("When")]),_v(": "),_c('mark',[_v("Last lecture slot of the semester")]),_v(" (Fri, Nov 15th). Remember to "),_c('mark',[_v("join 15-30 minutes earlier")]),_v(" than usual lecture start time. The Zoom link will be given to you closer to the day.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("PE Phase 1 will be conducted under exam conditions. For the remote mode, "),_c('mark',[_v("we will be following the "),_c('a',{attrs:{"href":"https://mysoc.nus.edu.sg/academic/e-exam-sop-for-students/"}},[_v("SoC's E-Exam SOP")])])]),_v(", combined with the deviations/refinements given below. Any non-compliance will be dealt with similar to a non-compliance in the final exam."),_c('br')])])]),_v(" "),_c('div',{attrs:{"id":"pe-proctoring-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Remote mode proctoring will be done via Zoom.")]),_v(" No admission if the following requirements are not met.\n"),_c('ul',[_c('li',[_c('strong',[_v("You need two Zoom devices")]),_v(" (PC: chat, audio "),_c('s',[_v("video")]),_v(", Phone: video, "),_c('s',[_v("audio")]),_v("), unless you have an external webcam for your PC.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" To change the Zoom display name as required by the PE, join the Zoom call, go to the 'Participation' panel, and search for yourself. Then, click on 'More', followed by 'Rename'.")]),_v(" "),_c('li',[_c('strong',[_v("Add your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE_seat_number]")]),_v(" in front of the "),_c('em',[_v("first name")]),_v(" of your Zoom display name")]),_v(", in your Zoom devices. "),_c('mark',[_v("Seat numbers can be found in "),_c('a',{attrs:{"href":"https://docs.google.com/spreadsheets/d/e/2PACX-1vSUbcJpMC5OdJkr_K6VxDwAkkrwJsqAFSPwHmZq88EbOdAWIPMeYvDQDYOUEcsEYVwACmAz5hH0W0ZY/pubhtml?gid=0&single=true"}},[_v("here")])]),_v(" about 2 days before the PE. e.g.,\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18] John Doe")]),_v(" ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("M18")]),_v(" is the seat number)")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18][PC] John Doe")]),_v(" (for the PC, if using a phone as well)")])])]),_v(" "),_c('li',[_c('strong',[_v("Set your camera")]),_v(" so that "),_c('em',[_v("all")]),_v(" the following are visible:\n"),_c('ol',[_c('li',[_v("your face (side view, "),_c('mark',[_v("no mask")]),_v(")")]),_v(" "),_c('li',[_v("your hands")]),_v(" "),_c('li',[_v("the work area (i.e., the tabletop)")]),_v(" "),_c('li',[_v("the computer screen"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/zoomCameraExample.png","width":"362"}})],1)])])])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Strongly recommended to join the Zoom waiting room "),_c('mark',[_v("15-30 minutes before the start time")]),_v(".")]),_v(" Admitting you to the Zoom session can take some time. You need to be in the meeting and ready to start the PE by 4.05pm"),_c('br'),_v(" "),_c('strong',[_v("If on F2F mode:")]),_v(" Strongly recommended to arrive at lecture venue (UTown-AUD2) around 10-15 minutes early. We can allow only 5 minutes (i.e., until 4.05pm) for you to get ready to start the PE.")]),_v(" "),_c('li',[_c('strong',[_v("In case of Zoom outage")]),_v(", we'll fall back on MS Teams (MST). Make sure you have MST running and have joined the "),_c('a',{attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82"}},[_v("MST Team for the class")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recording the screen is not required.")])]),_v(" "),_c('li',[_c('strong',[_v("You are allowed to use head/ear phones.")]),_v(" But no talking allowed (unless you are talking to the invigilator) -- so, no talking/singing to yourself as this can be mistaken for a rule violation.")]),_v(" "),_c('li',[_c('strong',[_c('mark',[_v("Only one screen")]),_v(" is allowed")]),_v(" (for both remote mode and F2F mode). If you want to use the secondary monitor, you should switch off the primary monitor. The screen being used should be fully visible in the Zoom camera view."),_c('br'),_v("\nIf using a second device for Zoom proctoring, the screen of that device should only be used for Zoom.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use the public chat channel to ask questions")]),_v(" from the prof. If you do, you might accidentally reveal which team you are testing.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use more than one CATcher instance")]),_v(" at the same time. Our grading scripts will red-flag you if you use multiple CATcher instances in parallel.")]),_v(" "),_c('li',[_c('strong',[_v("Use MS Teams (not Zoom) private messages to communicate with the prof.")]),_v(" Zoom sessions are invigilated by tutors, not the prof.")]),_v(" "),_c('li',[_c('strong',[_v("Do not view video Zoom feeds of others")]),_v(" while the testing is ongoing. Keep the video view minimized.")]),_v(" "),_c('li',[_c('strong',[_v("Bug reporting will be done using CATcher")]),_v(", similar to,")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"primary","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("PE-D Preparation")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("Ensure that you have accepted the invitation to join the GitHub org used by the course. Go to "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1"}},[_v("https://github.com/nus-cs2103-AY2425S1")]),_v(" to accept the invitation.")])]),_v(" "),_c('li',[_c('p',[_v("Ensure you have access to a "),_c('strong',[_v("computer that is able to run course projects")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. has the right Java version")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Ensure you can use "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")])]),_v(" on your computer. You should have done this when you smoke-tested CATcher earlier in the semester.")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("If not using CATcher")])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"not-using-catcher-warning"}},[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('div',{attrs:{"id":"pe-create-repo"}},[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Have a good screen grab tool")]),_v(" with annotation features so that you can quickly take a screenshot of a bug, annotate it, and post in using CATcher."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('kbd',[_v("Ctrl")]),_v("+"),_c('kbd',[_v("V")]),_v(" to paste a picture from the clipboard into a text box in a bug report.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("[Optional] Have a good screen recording tool")]),_v(" if you plan to use screen recording clips as part of your bug reports. Ensure that your screen recording tool can create small files as CATcher doesn't allow files bigger than 10Mb."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})]),_v(" As the CATcher support for uploading screen recordings is new and limited, use it only if strictly necessary -- use screenshots for other cases.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('span',{staticClass:"text-danger"},[_v("Download the product to be tested")])]),_v(".")])])]),_v(" "),_c('tabs',{attrs:{"active":"1","add-class":"ml-4"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified which team to test (likely to be in the morning of PE-D day), download the JAR file and the UG PDF file from the team's latest release.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified of the download location, download the zip file that bears your name. The password required to unzip it will be given to you at the start of the PE.")])])])],1),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Testing tips")])])]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Use easy-to-remember patterns in test data.")]),_v(" For example, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("12345678")]),_v(" as a phone number while testing and it appears as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2345678")]),_v(" somewhere else in the UI, you can easily spot that the first digit has gone missing. But if you used a random number instead, detecting that bug won't be as easy. Similarly, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Bee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Benny Lee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Charles Pereira")]),_v(" as test data (note how the names start with letters A, B, C), it will be easy to detect if one goes missing, or they appear in the incorrect order.")]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Go wide before you go deep")]),_v(". Do a light testing of all features first. That will give you a better idea of which features are likely to be more buggy. Spending equal time for all features or testing in the order the features appear in the UG is not always the best approach.")])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("During the bug reporting periods (i.e., "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")]),_v(" and "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part II")]),_v("), do not use websites/software not in the list given below.")]),_v(" If you need to visit a different website or use another software, please ask for permission first.\n"),_c('ul',[_c('li',[_v("Website: Canvas")]),_v(" "),_c('li',[_v("Website/software: MSTeams (only to communicate with the prof of Tech support)")]),_v(" "),_c('li',[_v("Website: Course website "),_c('span',{staticClass:"dimmed"},[_v("(e.g., to look up PE info)")])]),_v(" "),_c('li',[_v("Software: CATcher, any text editor, any screen grab/recording software")]),_v(" "),_c('li',[_v("Software: PDF reader "),_c('span',{staticClass:"dimmed"},[_v("(to read the UG/DG or other references such as the textbook)")])]),_v(" "),_c('li',[_v("Software: A text editor or word processing software "),_c('span',{staticClass:"dimmed"},[_v("(to keep notes while testing)")])])])]),_v(" "),_c('li',[_c('mark',[_c('strong',[_v("Do not visit GitHub in")]),_v(" "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")])]),_v(" unless you are going there to download a file the team has provided and is needed for testing. You may visit GitHub during part II and part III.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use any other software running")]),_v(" in the background e.g., Telegram chat.")]),_v(" "),_c('li',[_c('strong',[_v("This is a "),_c('em',[_v("manual")]),_v(" testing session")]),_v(". Do not use any test automation tools or custom scripts.")]),_v(" "),_c('li',[_c('strong',[_v("You may use any digital/physical notes")]),_v(" during the PE "),_c('span',{staticClass:"dimmed"},[_v("e.g., a list of things to check")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recommended to read the guidelines the dev team will follow when responding to your bug reports later")]),_v(", given in the panel below. This will help decide what kind of bugs to report.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs reported during the PE should be the result of your own testing")]),_v(". "),_c('span',{staticClass:"text-danger"},[_v("Reporting bugs found by others as your own will be reported as a case of academic dishonesty")]),_v(" (severity is similar to cheating during the final exam).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Guidelines for the dev team to follow when triaging PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("[Within 24 hours prior to the PE] Get CATcher 'warmed-up' for the PE")]),_v("."),_c('br'),_v(" "),_c('mark',[_v("Strongly recommended")]),_v(" to do the following about a day in advance, so that there is enough lead time to sort out any CATcher-related problems "),_c('em',[_v("before")]),_v(" the PE.\n"),_c('ol',[_c('li',[_v("Login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")]),_v(",\nwhile choosing the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(" as the session.")]),_v(" "),_c('li',[_v("Allow CATcher to create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(", when asked.")]),_v(" "),_c('li',[_v("Create a dummy bug report. Edit it. Delete it."),_c('br'),_v("\nCaution: Do not reuse these dummy bug reports (i.e., by editing them later) to submit real PE bugs.\nAs they were created outside the PE duration, they will be ignored by PE bug processing scripts.")]),_v(" "),_c('li',[_v("If you encounter any problems, post in the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")])])])])])])],1),_c('p'),_v(" "),_m(23)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-ensure-the-code-is-reposense-compatible"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(24),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-ensure-the-code-is-reposense-compatible","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{attrs:{"id":"midV13-repoSenseCompatible"}},[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_m(25),_v(" "),_c('p'),_v(" "),_m(26)])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking-2"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-3"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-3"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(27),_v(" "),_m(28),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(29),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Phases")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-phase-1-bug-reporting"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 1: Bug Reporting")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-bug-reporting","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_c('p'),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-i-product-testing-60-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part I")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Product Testing [60 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-i-product-testing-60-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >50%, a substantial bonus if >70%) of your bugs are "),_c('em',[_c('strong',[_v("accepted as reported")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" of the bug match the values you chose initially and the bug is accepted by the team).")]),_v(" "),_c('p',[_v("Take away: Aim for the "),_c('em',[_v("correct")]),_v(" severity/type etc. rather than the one that gives you most marks, as the former can end up earning you more marks in the end anyway.")])]),_v(" "),_c('p',[_c('strong',[_v("Test the product and report bugs")]),_v(" as described below. You may report both product bugs and documentation bugs during this period.")]),_v(" "),_c('div',[_c('box',[_c('h5',{attrs:{"id":"testing-instructions-for-pe-and-pe-d"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_c('strong',[_v("Testing instructions for PE and PE-D")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-instructions-for-pe-and-pe-d","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h6',{attrs:{"id":"a-launching-the-jar-file"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("a) Launching the JAR file")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#a-launching-the-jar-file","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Get the jar file to be tested:")])]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the "),_c('em',[_v("latest")]),_v(" JAR file from the team's releases page, if you haven't done this already.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the zip file from the given location (to be given to you at least a few hours before the PE), if you haven't done that already.")]),_v(" "),_c('li',[_v("The file is zipped using a two-part password.\n"),_c('ul',[_c('li',[_v("We will email you the second part in advance, via email (it's unique to each student). Keep it safe, and have it ready at the start of the PE.")]),_v(" "),_c('li',[_v("At the start of the PE, we'll give you the first part of the password (common to the whole class). Use combined password to unzip the file, which should give you another zip file with the name suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("_inner.zip")]),_v(".")]),_v(" "),_c('li',[_v("Unzip that second zip file normally (no password required). That will give you a folder containing the JAR file to test and other PDF files needed for the PE. "),_c('mark',[_v("Warning: do not run the JAR file while it is still inside the zip file")]),_v("."),_c('br'),_v("\nIgnore the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("padding_file")]),_v(" found among the extracted files. "),_c('span',{staticClass:"dimmed"},[_v("Its only purpose is to mask the true size of the JAR file so that someone cannot guess which team they will be testing based on the zip file size.")])]),_v(" "),_c('li',[_v("Recommended: Try above steps using the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103/website-base/files/14849276/JohnDoe.zip"}},[_v("this sample zip file")]),_v(" if you wish (first part of the password: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-")]),_v(", second part: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password2")]),_v(" i.e., you should use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-password2")]),_v(" to unzip it)."),_c('br'),_v("\nUse the JAR file inside it to try the steps given below as well, to confirm your computer's Java environment is as expected and can run PE jar files.")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"important","id":"tp-jar-testing-steps","seamless":""}},[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])]),_v(" "),_c('box',{attrs:{"type":"info"}},[_c('p',[_c('strong',[_c('span',{staticClass:"large"},[_v("If the product doesn't work at all:")])]),_v(" If the product fails catastrophically "),_c('span',{staticClass:"dimmed"},[_v("e.g., cannot even launch, or even the basic commands crash the app")]),_v(", do the following:")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Check the UG")]),_v(" of the team, to see if there are extra things you need to do before launching the JAR."),_c('br'),_v(" "),_c('strong',[_v("Confirm that you are using Java 17")]),_v(" and using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to run the JAR, as explained in points above.")]),_v(" "),_c('li',[_c('strong',[_v("Contact our head TA")]),_v(" via MS Teams (name: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Kim Hyeongcheol")]),_v(", NUSNET: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dcskh")]),_v(") and give him"),_c('br'),_v("\n(a) "),_c('strong',[_v("a screenshot")]),_v(" of the error message, and"),_c('br'),_v("\n(b) "),_c('strong',[_v("your GitHub")]),_v(" username.")]),_v(" "),_c('li',[_c('strong',[_v("Wait for him to give you a fallback")]),_v(" team to test."),_c('br'),_v("\nContact the prof (via MS Teams) if you didn't get a response from Kim within 5 minutes.")]),_v(" "),_c('li',[_c('strong',[_v("Delete bug reports you submitted for the previous team")]),_v(" (if any), using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("You should not go back to testing the previous team")]),_v(" "),_c('em',[_v("after")]),_v(" you've been given a fallback team to test.")])])]),_v(" "),_c('h6',{attrs:{"id":"b-what-to-test"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("b) What to test")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#b-what-to-test","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Test the product "),_c('mark',[_v("based on the User Guide (PDF version)")]),_v(" available from their releases page on GitHub.")]),_v(" "),_c('li',[_v("Do "),_c('mark',[_c('em',[_v("system")]),_v(" testing first")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product work as specified by the documentation?")]),_v(". If there is time left, you can "),_c('mark',[_v("do "),_c('em',[_v("acceptance")]),_v(" testing as well")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product solve the problem it claims to solve?")]),_v(".")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Test "),_c('mark',[_v("based on the Developer Guide")]),_v(" (Appendix named "),_c('em',[_v("Instructions for Manual Testing")]),_v(") "),_c('mark',[_v("and the User Guide")]),_v(" PDF files.")]),_v(" The testing instructions in the Developer Guide can provide you some guidance but if you follow those instructions strictly, you are unlikely to find many bugs. You can deviate from the instructions to probe areas that are more likely to have bugs."),_c('br'),_v(" "),_c('strong',[_v("If the provided UG/DG PDF files have serious issues")]),_v(" (e.g., some parts seem to be missing), ask prof for permission to use the Web versions of UG/DG instead.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The DG appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(" (if it exists) gives some enhancements the team is planning for the near future. The feature flaws these enhancements address are 'known' -- reporting them will not earn you any credit."),_c('br'),_v("\nHowever, you can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaws")]),_v(" bugs if you think these enhancements themselves are flawed/inadequate."),_c('br'),_v("\nYou can also report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs if any of the enhancements in this list combines more than one enhancement.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You may do both "),_c('em',[_v("system testing")]),_v(" and "),_c('em',[_v("acceptance testing")])]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("Be careful when copying commands from the UG")]),_v(" (PDF version) to the app as some PDF viewers can affect the pasted text. If that happens, you might want to open the UG in a different PDF viewer."),_c('br'),_v("\nIf the command you copied spans multiple lines, check to ensure the line break did not mess up the copied command.")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"c-what-bugs-to-report"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("c) What bugs to report?")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#c-what-bugs-to-report","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("You may report functionality bugs, UG bugs, and feature flaws.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You can also post suggestions on how to improve the product."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Be diplomatic when reporting bugs or suggesting improvements. For example, instead of criticising the current behavior, simply suggest alternatives to consider.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Report functionality bugs:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Do not post suggestions but if the product is missing a critical functionality that makes the product less useful to the intended user, it can be reported as a bug of type "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Type.FeatureFlaw")]),_v(". The dev team is allowed to reject bug reports framed as mere suggestions or/and lacking in a convincing justification as to why the omission or the current design of that functionality is problematic.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You may also report documentation bugs (UG bugs in particular) but keep in mind that there is another time (i.e., part II) set aside for reporting documentation bugs too.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p')])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"d-how-to-report-bugs"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("d) How to report bugs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#d-how-to-report-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Post bugs as you find them")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not wait to post all bugs at the end)")]),_v(" because "),_c('span',{staticClass:"text-danger"},[_v("bug reports created/updated after the allocated time will not count.")]),_v(" Even minor updates (such as changing a label) outside the allowed time window will invalidate that bug.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Launch CATcher, and login to the correct profile (when CATcher asks, consent to creating a new repo):\n"),_c('ul',[_c('li',[_v("PE Dry Run: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE Dry run")])]),_v(" "),_c('li',[_v("PE: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")])])])]),_v(" "),_c('li',[_v("Post bugs using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("If you encounter a 'Failed to fetch' error")]),_v(" during CATcher login, try again. If it still fails, try a different network e.g., your mobile phone's hotspot.")]),_v(" "),_c('li',[_c('strong',[_v("If GitHub prompts you to 're-authorize' CATcher")]),_v(" (this happens if GitHub detects a rush of login requests from the same account), just re-authorize as requested.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('p',[_v("If you 'warmed up' CATcher for the PE earlier, you should already have a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" in your GitHub account, created by CATcher during that warming up. If that is not the case, create a repo to post your bug reports as given in the panel below:")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Creating a repo to post PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Post bug reports in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" repo.")]),_v(" "),_c('li',[_v("The whole description of the bug should be in the issue description i.e., "),_c('mark',[_v("do not add comments to the issue")]),_v(".")]),_v(" "),_c('li',[_v("Choose exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label and exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.severity")]),_v(" label.")])])],1)])],1)],1),_v(" "),_c('h6',{attrs:{"id":"e-bug-report-format"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("e) Bug report format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#e-bug-report-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Each bug should be a separate issue "),_c('span',{staticClass:"dimmed"},[_v("i.e., do not report multiple problems in the same bug report.")]),_c('br'),_v("\nIf there are multiple bugs in the same report, the dev team will select only one of the bugs in the report and discard the others.")]),_v(" "),_c('li',[_v("When reporting similar bugs, it is safer to report them as separate bugs because there is no penalty for reporting duplicates while putting multiple bugs in the same report can reduce your bug count (see the previous point). But as submitting multiple bug reports take extra time, if you are quite sure they will be considered as "),_c('em',[_v("duplicates")]),_v(" by the dev team later, you can report them together, to save time.")]),_v(" "),_c('li',[_v("Write good quality bug reports; "),_c('mark',[_v("poor quality or incorrect bug reports will not earn credit")]),_v("."),_c('br'),_v("\nRemember to give enough details for the receiving team to reproduce the bug. If the receiving team cannot reproduce the bug, you will not be able to get credit for it.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Reminder: Qualities of a good bug report")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has a descriptive title")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has enough details e.g., "),_c('mark',[_v("steps to reproduce, expected, actual, and screenshots")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("severity/type labels chosen are not too far off")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("is written in a non-confrontational tone")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" label to the bug report. Bug reports without a severity label are considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" (lower severity bugs earn lower credit)"),_c('br')])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label to the issue.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)]),_v(" "),_c('ul',[_c('li',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("If you need to include "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(" symbols in your bug report")]),_v(", you can either use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\")]),_v(" to escape them (i.e., use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\>")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x \\< y")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x < y")]),_v(") or wrap it inside back-ticks."),_c('br'),_v("\nReason: CATcher and GitHub strips out content wrapped in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(", for security reasons.")])])],1)],1),_v(" "),_c('p',[_c('mark',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("When in doubt, choose the lower severity:")])]),_v(" If the severity of a bug seems to be smack in the "),_c('em',[_v("middle")]),_v(" of two severity levels, choose the lower severity (unless much closer to the higher one than the lower one).")]),_v(" "),_c('ul',[_c('li',[_v("Reason: The teaching team follow the same policy when adjudicating disputed severity levels in the last phase\nof the PE.")]),_v(" "),_c('li',[_v("As the tester, you might feel like you are throwing away marks by choosing a lower priority; but the lower\npriority has a lower risk of being disputed by the dev team, giving you (and the dev team)\na better chance of earning bonus marks for accuracy (which will be substantial)."),_c('br'),_v("\nTo make your case stronger, state in the bug report why you think the bug might even qualify for a higher severity, while you actually chose the lower one.")]),_v(" "),_c('li',[_v("In this section, there will be a "),_c('em',[_v("mass identity check")])])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":"","id":"identity-check-info","tags":"m--cs2103"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Mass identity check")])])]},proxy:true}])},[_v(" "),_c('p',[_v("When the invigilator announces an identity check,")]),_v(" "),_c('ol',[_c('li',[_v("remove mask (if any)")]),_v(" "),_c('li',[_v("turn towards the camera")]),_v(" "),_c('li',[_v("move closer to the camera (but do not adjust the camera position) -- no need to show the student card")]),_v(" "),_c('li',[_v("hold that pose until the invigilator has taken a screenshot and asks you to go back to the PE activity.")])]),_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_v("Please comply quickly")]),_v(" as non-compliance can delay the PE for everyone. This is expected to take no more than 15 seconds.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Some students will be testing less/more buggy products than others? Isn't that unfair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("As each product is tested by 4-5 testers, after all PE bugs have been finalized, we know how 'buggy' each product is. We then use that information for calculating your PE-related marks. So, the marks are calibrated to match the bugginess of the product you tested.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested has hardly any bugs?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("If the total bugs found (by "),_c('em',[_v("all")]),_v(" testers) in a product is below a certain level, we compensate those testers by increasing the weightage given to PE-D performance, and their dev-testing results.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested is very buggy? Am I expected to find all those bugs")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No. Given the PE has only a short time, we don't expect you to find "),_c('em',[_v("all")]),_v(" bugs in the product. To get full marks, you only need to report a certain percentage of the bugs (e.g., half), or a certain quantity of bugs (the quantity also factors in the nature of the bug e.g., severity), whichever is lower.")])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-ii-evaluating-documents-30-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part II")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Evaluating Documents [30 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-ii-evaluating-documents-30-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use this slot mainly to report documentation bugs")]),_v(" (but you may report product bugs too). You may report bugs related to the UG and the DG."),_c('br'),_v("\nOnly the content of the UG/DG PDF files (not the online version) should be considered.")]),_v(" "),_c('li',[_c('strong',[_v("For each bug reported, cite evidence and justify.")]),_v(" For example, if you think the explanation of a feature is too brief, explain what information is missing and why the omission hinders the reader."),_c('br'),_v("\nDo not report bugs that are not contained within in the UG and DG pdf files (e.g., bugs in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("You may visit the team's project on GitHub during this portion")]),_v(", for the purpose of verifying the accuracy of documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., to check if a diagram matches the code")]),_v(". You are also allowed to download and open the team's code in a code editor.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You "),_c('em',[_v("may")]),_v(" report grammar issues")]),_v(" as bugs but note that minor grammar issues that don't hinder the reader are allowed to be categorized as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" (by the receiving team) -- such bugs earn only small amount or credit for the tester (hence, do not waste time reporting too many minor grammar errors).")])])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iii-overall-evaluation-15-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part III")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Overall Evaluation [15 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iii-overall-evaluation-15-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("To be submitted via TEAMMATES. You are expected to complete this during the PE session itself, but "),_c('mark',[_v("you have until the end of the day to submit (or revise) your submissions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("If you have to valid reason to leave the PE early")]),_v(" (e.g., having another exam right after the PE), you may leave after part II has ended and do part III later -- but note that if you fail to submit this by the hard deadline (i.e., end of the day), you will receive an "),_c('span',{staticClass:"text-danger"},[_v("automatic penalty")]),_v(".")]),_v(" "),_c('li',[_v("The TEAMMATES email containing the submission link should have reached you the day before the PE. If you didn't receive it by then, you can request it to be resent from "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("this page")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If TEAMMATES submission page is slow/fails to load")]),_v(" (all of you accessing it at the same time is likely to overload the server), wait 3-5 minutes and try again. "),_c('span',{staticClass:"text-danger"},[_v("Do not refresh the page repeatedly")]),_v(" as that will overload the server even more, and recovery can take even longer.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"peek":"","panelId":"important-questions-included-in-the-evaluation"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"important-questions-included-in-the-evaluation"}},[_v("Important questions included in the evaluation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#important-questions-included-in-the-evaluation","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"projectGrading-featureFit-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-userGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-devGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-effort-instructions"}},[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])]),_v(" "),_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("[Optional] Concerns or any noteworthy observations about the product you evaluated")])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Finally, what did you like about the product you tested?")])],1)])]),_v(" "),_c('p')],1),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iv-trimming-bugs-half-a-day"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part IV")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Trimming bugs [~half a day]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iv-trimming-bugs-half-a-day","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("This segment gives testers a second chance revisit their bug reports, and choose upto 7 bugs that they wish to send to the dev team.")]),_v(" They will be allowed to change bug type/severity too (but will not be allowed to change bug title or the description)."),_c('br'),_v("\nObjectives:\n"),_c('ul',[_c('li',[_v("Testers can correct their type/severity choices in case they chose incorrectly during the PE due to time pressure.")]),_v(" "),_c('li',[_v("Testers get a chance to withdraw lower impact (or uncertain) bugs so that there is less work for the dev team during the next phase.")])])]),_v(" "),_c('li',[_c('strong',[_v("Procedure:")]),_v(" coming soon ...")])]),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-2-developer-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 2: Developer Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-2-developer-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")]),_c('p'),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Mon, Nov 18th 2359")])]),_v(" "),_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_c('strong',[_v("Yes, that can be better!")])]),_v(" For each bug report you receive, if you think a software engineer who takes pride in their own work would say \"yes, that can be better!\", accept it graciously, even if you can come up with "),_c('em',[_v("some")]),_v(" argument to justify the current behavior. "),_c('br'),_v("\nEven when you still want to defend the current behavior, instead of pretending that the behavior was a deliberate choice to begin with, you can say something like,")]),_v(" "),_c('blockquote',[_c('p',[_v("\"Thanks for raising this. Indeed, it didn't occur to us. But now that we have thought about it, we still feel ...\"")])]),_v(" "),_c('p',[_c('strong',[_c('em',[_v("Some")]),_v(" bugs are 'expected'.")]),_v(" Given the short time you had for the tP and your inexperience in SE team projects, this work is not expected to be totally bug free. The grading scheme factors that in already -- i.e., your grade will not suffer if you accept a few bugs in this phase.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >60% substantial bonus if >80%) of bugs are "),_c('em',[_c('strong',[_v("accepted as triaged")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(" of the bug match the ones you chose).")])]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("It's not bargaining!")])]),_v(" "),_c('p',[_v("When the tester and the dev team cannot reach a consensus, the teaching team will select either the dev team position or the tester position as the final state of the bug, whichever appear to be closer to being reasonable. "),_c('span',{staticClass:"text-danger"},[_v("The teaching team will not come up with our own position, or choose a middle ground.")])]),_v(" "),_c('p',[_v("Hence, do not be tempted to argue for an unreasonable position in the hope that you'll receive something less than asked but still in your favor e.g., if the tester chose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" but you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(", don't argue for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" in the hope that the teaching team will decide a middle ground of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(". It's more likely that the teaching team will choose the tester's position as yours seems unreasonable.")]),_v(" "),_c('p',[_v("More importantly, this is not a bargaining between two parties; it's "),_c('strong',[_v("an attempt to determine the true nature of the bug, and your ability to do so (which is an important skill)")]),_v(".")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('mark',{staticClass:"text-success"},[_c('strong',[_v("Favor "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" over "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")])])])]),_v(" "),_c('p',[_v("If there is even the slightest chance that the change directly suggested (or indirectly hinted at) by a bug report is an improvement that you "),_c('em',[_v("might")]),_v(" consider doing in a future version of the product, choose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v("."),_c('br'),_v("\nChoose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" only for bug reports that are clearly incorrect (e.g., the tester misunderstood something)."),_c('br'),_v("\nAccordingly, it is typical a team to have a lot more "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs and very few "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" bugs.")]),_v(" "),_c('p',[_v("Note that "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs earn a small amount of credit for the tester without any penalty for the dev team, unless there is an unusually high number of such bugs for a team.")])]),_v(" "),_c('p',[_v("Bug reviewing is recommended to be done as a team as some of the decisions need team consensus.")]),_v(" "),_c('box',[_c('p',[_c('strong',[_v("Instructions for Reviewing Bug Reports")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Don't freak out if there are a lot of bug reports.")]),_v(" Many can be duplicates and some can be "),_c('em',[_v("false positives")]),_v(". In any case, we anticipate that all of these products will have some bugs and our penalty for bugs is not harsh. Furthermore, it depends on the severity of the bug. Some bug may not even be penalized.")]),_v(" "),_c('li',[_c('strong',[_v("Nit-picking is a good sign")]),_v(": If you receive a lot of nit-picking type of bugs that make you roll your eyes, it means testers were unable to find more serious bugs. That's a good thing.")]),_v(" "),_c('li',[_c('strong',[_v("Not exactly zero-sum")]),_v(": As mentioned earlier, the penalty for having a specific bug is not the same as the reward for reporting that bug (it's not a "),_c('em',[_v("zero-sum")]),_v(" game). For example, the reward for testers will be higher (because we don't expect the products to have that many bugs after they have gone through so much prior testing)")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Penalty for a minor bug (e.g., "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("an indicative value only; the actual value depends on the severity, type, and the number of assignees")]},proxy:true}])},[_v("-0.15")]),_v(") is unlikely to make a difference in your final grade")],1),_v(", especially given that the penalty applies only if you have more than a certain amount of bugs."),_c('br')]),_v(" "),_c('p',[_v("For example, in a typical case a developer might be assigned 5+ "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" bugs before the penalty even starts affecting their marks.")]),_v(" "),_c('p',[_v("Accordingly, we hope you'll "),_c('strong',[_v("accept bug reports graciously")]),_v(" (rather than fight tooth-and-nail to reject "),_c('em',[_v("every")]),_v(" bug report received) if you think the bug is within the ballpark of 'reasonable'. Those minor bugs are really not worth stressing/fighting over.")])]),_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"info"},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-hard-hat",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("CATcher does not come with a UG, but the UI is fairly intuitive (there are tool tips too). Do post in the forum if you need any guidance with its usage.")]),_v(" "),_c('li',[_v("Tip: If you think others might be editing the same issues at the same time, use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Sync")]),_v(" button at the top to force-sync your view with the latest data from GitHub.")])])]),_v(" "),_c('ul',[_c('li',[_v("Go to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher Web app")]),_v(", and login to the profile "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(". It will show all the bugs assigned to your team, divided into three sections:\n"),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" - Issues that your team has not processed yet.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Responded")]),_v(" - Your job is to get all issues to this category.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Faulty Issues")]),_v(" - e.g., Bugs marked as duplicates of each other, or causing circular "),_c('em',[_v("duplicate")]),_v(" relationships. Fix the problem given so that no issues remain in this category.")])])]),_v(" "),_c('li',[_v("Respond to the bug reports shown.")])])],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',{attrs:{"id":"warning-use-catcher"}},[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug seems to be for a different product")]),_v(" (i.e. wrongly assigned to your team), let us know ASAP.")]),_v(" "),_c('li',[_c('strong',[_v("If the bug is reported multiple times")]),_v(",\n"),_c('ul',[_c('li',[_v("Mark "),_c('span',{staticClass:"text-danger"},[_v("all copies "),_c('mark',[_v("EXCEPT one")])]),_v(" as duplicates of the one left out (let's call that one the "),_c('em',[_v("original")]),_v(") using the "),_c('span',{staticClass:"fas fa-check-square",attrs:{"aria-hidden":"true"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A Duplicate of")]),_v(" tick box.")]),_v(" "),_c('li',[_v("For each group of duplicates, all duplicates should point to one "),_c('em',[_v("original")]),_v(" i.e., no multiple levels of duplicates, and no cyclical duplication relationships.")]),_v(" "),_c('li',[_v("If the duplication status is eventually accepted, all duplicates will be assumed to have inherited the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" from the "),_c('em',[_v("original")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("If you cannot reproduce the bug based on the info given by the tester")]),_v(" you are still expected to make a "),_c('em',[_v("reasonable attempt")]),_v(" to go beyond the information provided by the tester to reproduce the bug, if there is clear evidence of something wrong."),_c('br'),_v("\nFor example, the screenshot in the bug report clearly shows an error message that should not appear, but you can't reproduce the error message based on the info given by the tester. Perhaps the error was caused by something else the tester did although the tester didn't realize it is connected to the error. In this case, based on the error message, you might be in a better position to figure out the real cause of the error. If you don't, the decision can go against you in a later phase if either the tester or the moderator figures out how to reproduce the error and the moderator decides that it is something you should have been able to figure out yourself.")])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Apply one of these labels")]),_v(" (if missing, we assign: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(")")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',[_v("Response")]),_v(" Labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(": You accept it as a valid bug.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(": It is a valid issue, but fixing it is less important than the work done in the current version of the product "),_c('span',{staticClass:"dimmed"},[_v("e.g., it was not related to features delivered in v1.6 or lower priority than the work already done in v1.6")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Rejected")]),_v(": What tester treated as a bug is in fact the "),_c('em',[_v("expected")]),_v(" and "),_c('em',[_v("correct")]),_v(" behavior (from the user's point of view), or the tester was mistaken in some other way. "),_c('span',{staticClass:"dimmed"},[_v("Note: Disagreement with the bug severity/type given by the tester is not a valid reason to reject the bug.")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.CannotReproduce")]),_v(": You are unable to reproduce the behavior reported in the bug after multiple tries.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.IssueUnclear")]),_v(": The issue description is not clear. Don't post comments asking the tester to give more info. The tester will not be able to see those comments because the bug reports are anonymous.")])]),_v(" "),_c('p',[_v("Only the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(" bugs are counted against the dev team. While "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" are not counted against the dev team, they can earn a small amount of consolation marks for the tester. The other three do not affect marks of either the dev team or the tester, except when calculating bonus marks for accuracy.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original bug type assigned to the bug")]),_v(", you may change it to the correct type.")])]),_v(" "),_c('div',{staticClass:"indented",attrs:{"id":"type-labels"}},[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1),_v(" "),_c('p',[_c('strong',[_v("If a bug fits multiple types "),_c('em',[_v("equally")]),_v(" well")]),_v(", the team is free to choose the one they think the best match, but keep the type chosen by the tester if it is one of the types that fits the bug equally well.")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original severity assigned to the bug")]),_v(", you may change it to the correct level.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you need the teaching team's inputs when deciding on a bug")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., if you are not sure if the UML notation is correct)")]),_v(", post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". Remember to "),_c('mark',[_v("quote the issue number shown in CATcher")]),_v(" (it appears at the end of the issue title)."),_c('br'),_v("\nKeep in mind that the bug triaging accuracy affects your marks, and therefore, the teaching team prefers not to dictate a specific response, type, or severity for a particular bug report (i.e., that decision should be yours). Nevertheless, we can provide some general comments relevant to the issue at hand. Additionally, we encourage other students to chime in with their opinions, as such discussions have learning value.")])]),_v(" "),_c('div',{staticClass:"indented-level1",attrs:{"id":"additionalGuidelinesForBugTriaging"}},[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-2"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-2"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-2"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-2"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide who should take responsibility for the bug")]),_v(". Use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Assignees")]),_v(" field to assign the issue to that person(s). There is no need to actually fix the bug though. It's simply an indication/acceptance of responsibility. "),_c('strong',[_v("If there is no assignee, we will distribute the penalty for that bug (if any) equally among all team members")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., if the penalty is -0.4 and there are 4 members, each member will be penalized -0.1")]),_v(".\n"),_c('ul',[_c('li',[_v("If it is not easy to decide the assignee(s), we recommend (but not enforce) that the feature owner should be assigned bugs related to the feature, Reason: The feature owner should have defended the feature against bugs using automated tests and defensive coding techniques.")]),_v(" "),_c('li',[_v("It is also fine to not assign a bug to anyone, in which case the penalty will be divided equally among team members.")])])])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_v("As far as possible, "),_c('mark',[_c('strong',[_v("choose the correct "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(", assignees, and duplicate status even for bugs you are not accepting")])]),_v(". Reason: your "),_c('em',[_v("non-acceptance")]),_v(" may be rejected in a later phase, in which case we need to grade it as an accepted bug."),_c('br'),_v(" "),_c('strong',[_v("If a bug's 'duplicate' status was rejected later")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., the tester says it is not really a duplicate and the teaching team agrees with the tester)")]),_v(", it will inherit the response/type/severity/assignees from the 'original' bug that it was claimed to be a duplicate of.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Justify your response.")]),_v(" For all the following cases, "),_c('mark',[_v("you must add a comment justifying your stance")]),_v(". Testers will get to respond to all those cases and will be considered by the teaching team in later phases (when resolving disputed bug reports)."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" If you don't provide a justification and the tester disagrees with your decision, the teaching team will have no choice but to rule in favor of the tester.")]),_v(" "),_c('ul',[_c('li',[_v("downgrading severity")]),_v(" "),_c('li',[_v("non-acceptance of a bug")]),_v(" "),_c('li',[_v("changing the bug type")]),_v(" "),_c('li',[_v("non-obvious duplicate")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Do we need to justify even if we accept the bug "),_c('em',[_v("as is")]),_v("?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No need to provide a justification if you accept the bug without "),_c('em',[_v("any")]),_v(" changes to it.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: So, those who write more code will be hit with more bugs? How's that fair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Penalty for bugs is applied based on bug "),_c('em',[_v("density")]),_v(", not bug count. For example, if Ann contributed twice as much implementation effort as Tom, and was assigned twice as many bugs as Tom, both will receive similar penalties, as both had similar bug densities.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug is real but the tester used the wrong label (e.g., used the wrong "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v("). Can we reject that bug?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("A bug is a bug irrespective of the label used. Instead of rejecting, rectify the label.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug the tester reported is legit but the expected behavior tester suggested is not correct?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You should accept the bug but state that you disagree with the expected/suggested behavior. Reason: the main job of the tester is to detect bugs; suggesting a solution is optional.")])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_v("You can also refer to the below guidelines:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-2"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-3-tester-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 3: Tester Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-3-tester-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")]),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Start:")]),_v(" Within 1 day after Phase 2 ends."),_c('br')]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" While you are waiting for Phase 3 to start, comments will be added to the bug reports in your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/pe")]),_v(" repo, to indicate the response each received from the receiving team. "),_c('span',{staticClass:"text-danger"},[_v("Please do not edit any of those comments or reply to them via the GitHub interface.")]),_v(" Doing so can invalidate them, in which case the grading script will assume that you agree with the dev team's response. Instead, wait till the start of the Phase 3 is announced, after which you should use CATcher to respond.")])]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Thu, Nov 21st 2359")])]),_v(" "),_c('ul',[_c('li',[_v("In this phase you will get to state whether you agree or disagree with the dev team's response to the bugs you reported. If a bug reported has been subjected to any of the below by the dev team, you can record your objections and the reason for the objection.\n"),_c('ul',[_c('li',[_v("not accepted")]),_v(" "),_c('li',[_v("severity downgraded")]),_v(" "),_c('li',[_v("bug type changed")]),_v(" "),_c('li',[_v("bug flagged as duplicate "),_c('span',{staticClass:"dimmed"},[_v("(Note that you still get credit for bugs flagged as duplicates, unless you reported both bugs yourself. Nevertheless, it is in your interest to object to incorrect duplicate flags because when a bug is reported by more testers, it will be considered an 'obvious' bug and will earn slightly less credit than otherwise)")])])])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_v("Don't feel upset if the dev team did not totally agree")]),_v(" with most of the bugs you reported. That is to be expected, given you had very short time to make those bug decisions while the dev team had a lot more time to deliberate about them. Some may have given unreasonable (in your opinion) arguments against your bug reports; not to worry, just give your counter-arguments and leave it to the teaching team to decide (in the next phase) which position is more reasonable.")]),_v(" "),_c('p',[_v("However, "),_c('mark',[_v("if the dev team's argument is not too far from 'reasonable', "),_c('strong',[_v("it may be better to agree than disagree")])]),_v("."),_c('br'),_v("\nReason: an incorrect counterargument at this phase will lower your "),_c('em',[_v("accuracy")]),_v(" more than an incorrect decision made during the testing phase (because you now have more time to think about the bug) i.e., changing your position after you had more time to think of it and after having seen more information is encouraged, compared to sticking to your initial position 'no matter what'.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you would like to revise your own initial type/severity")]),_v(" in response to the team's inputs, you can state that in your explanation "),_c('span',{staticClass:"dimmed"},[_v("e.g., you rated the bug "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" and the team changed it to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" but now you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")])]),_v(" (do not change the original labels yourself though).")]),_v(" "),_c('li',[_v("You can also refer to the below guidelines, mentioned during the previous phase as well:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" PE → Phase 2 → Additional Guidelines for Bug Triaging")])]},proxy:true}])},[_v(" "),_c('div',[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging-2"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging-2"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging-2","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-3"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-3"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-3"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-3"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1)])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-3"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("If the dev team disagreed with an aspect (i.e., type/severity/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., accept vs not accept")]},proxy:true}])},[_v("validity")]),_v(") and you now agree with the dev team's position, it will not hurt your accuracy rating. Here are some examples (for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v("):")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Tester choice")]),_v(" "),_c('th',[_v("Dev choice")]),_v(" "),_c('th',[_v("Tester reaction")]),_v(" "),_c('th',[_v("Teacher decision")]),_v(" "),_c('th',[_v("Dev accuracy")]),_v(" "),_c('th',[_v("Tester accuracy")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_v("no effect")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low ")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])])])])])])]),_v(" "),_c('ul',[_c('li',[_v("If you do not respond to a dev response, we'll assume that you agree with it.")]),_v(" "),_c('li',[_v("Procedure:")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("When the phase has been announced as open, login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher"}},[_v("CATcher")]),_v(" as usual (profile: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(").")]),_v(" "),_c('li',[_v("For each issue listed in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" section:\n"),_c('ul',[_c('li',[_v("Click on it to go to the details, and read the dev team's response.")]),_v(" "),_c('li',[_v("If you disagree with any of the items listed, tick on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("I disagree")]),_v(" tick box and enter your justification for the disagreement, and click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(".")]),_v(" "),_c('li',[_v("If you are fine with the team's changes, click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(" without any other changes upon which the issue will move to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issue Responded")]),_v(" section.")])])]),_v(" "),_c('li',[_v("No action is required for the bugs the team accepted "),_c('em',[_v("exactly as you reported them")]),_v(" (i.e., no change to type or severity). They are shown in CATcher for your reference only.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1)],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the team rejected my bug report without giving a reason?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You can disagree with the rejection, and the teaching team will likely rule in your favor in the next phase.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Can I add more information about the bug when I object to a dev team's response?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Yes, you may. Given that the dev team did not get to see this addition info when they triaged the bug, the weight such additional info add to your case is lower than if you had that info in the initial bug report. Nevertheless, it can still help your cause, especially if the dev team should have thought about that info on their own, even if they were missing in the initial bug report.")])]),_v(" "),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-4-tutor-moderation"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 4: Tutor Moderation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-4-tutor-moderation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")])],1)])],1),_c('p')]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("6")])],1)],1),_v(" "),_m(30),_v(" "),_m(31),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600","onclick":"event.stopPropagation()"}})]),_v(" "),_m(32),_v(" "),_c('p'),_v(" "),_c('div')])]),_v(" "),_c('br'),_v(" "),_m(33)])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-week-13-public-release-v1-6"}},[_v("tP Week 13: Public release → v1.6 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-13"}},[_v("Intro to tP Week 13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-fix-pe-d-bugs"}},[_v("1 Fix PE-D bugs‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-submit-final-deliverables-tue-nov-12th-14-00"}},[_v("2 Submit final deliverables Tue, Nov 12th 14:00‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-prepare-for-the-practical-exam"}},[_v("3 Prepare for the practical exam‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-ensure-the-code-is-reposense-compatible"}},[_v("4 Ensure the code is RepoSense-compatible‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_v("5 Attend the practical exam Fri, Nov 15th 1600-1800‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_v("6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600‎")])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(34)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -107,6 +107,6 @@ with(this){return _c('div',[_c('ul',[_c('li',[_v("In the very unlikely event tha with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w12.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 12: Extra week for v1.5")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-deliverables.html"}},[_c('span',[_v("tP: Deliverables "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w2.html b/admin/tp-w2.html index b218d9d0e9..98cbbe04e5 100644 --- a/admin/tp-w2.html +++ b/admin/tp-w2.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/admin/tp-w2.page-vue-render.js b/admin/tp-w2.page-vue-render.js index 4c1720aaf4..418e463069 100644 --- a/admin/tp-w2.page-vue-render.js +++ b/admin/tp-w2.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{attrs:{"id":"main"}},[_c('div',{staticClass:"lead border-bottom border-left ml-3 mb-3",staticStyle:{"color":"purple"},attrs:{"id":"summary"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_v("None assigned for this week")])])]),_v(" "),_c('div',{attrs:{"id":"body"}},[_c('div'),_v(" "),_c('p'),_v(" "),_c('div')])]),_v(" "),_c('br')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w3.html b/admin/tp-w3.html index 5005d357aa..ee4a0b17b9 100644 --- a/admin/tp-w3.html +++ b/admin/tp-w3.html @@ -24,7 +24,7 @@

      tP: Forming TeamstP Week 4: Set direction


      tP Week 3: Kickoff

      1. Individual Task: Explore AB3 features Sat, Aug 31st 23:59
      2. Team Task: Set up a project meeting time by the end of the tutorial
      3. Team Task: Check up on team's collective iP status Tue, Sep 3rd

      Intro to tP Week 3

      This week, we kick off the tP with a few light individual and team tasks, described in the sections below.

      indicates an individual task (i.e., each team member has to do the task, graded individually)
      indicates a team task (i.e., some or all members may do the work; graded for the whole team).
      / indicates one-person-per-team task (i.e., one member can do the task on behalf of the team, although other members are welcome to pitch in).

      Stronger teams are welcome to stay one week ahead of the tP schedule. However, do not move ahead more than one week, as doing tP in a short burst will interfere with some of its learning outcomes.

      1 Individual Task: Explore AB3 features Sat, Aug 31st 23:59

      • Objectives: (1) To get each of you to think of ways to improve AB3 (2) To detect any Java version compatibility issues between your local set up and the expected Java version.

      • Submission: via Canvas survey named tP: AB3 Initial Experience by Sat, Aug 31st 23:59

      • Steps:

        1. Download the latest released version (i.e., the jar file) of AB3 from its upstream repo.
        2. Get it running in your computer. Play around with it to familiarize yourself with its current features.
        3. Add yourself to the list of contacts in AB3 (using the add ... command).
        4. Take a screenshot of the AB3 Window, while it shows your own contact info you added earlier. Save it as a .png file.
        5. Think about how the AB3 user experience can be improved, for example, by tweaking the command format, or the GUI, or the features. Note them down as a list of feature suggestions, as free text (i.e., no specific format).
          Suggested: Try to come up with at least 5 ways to improve AB3, while also trying to go beyond the simple/obvious ones (i.e., this is a chance to be insightful but also creative).
          Also keep the following tP constraints/recommendations in mind when doing this, as improvements that are not aligned with tP constraints are unlikely to be useful later.

      1. Use the Canvas survey mentioned above to submit the screenshot and the feature suggestions.
        -Note: The feature suggestions you submit will be shared with the team members later, so that your team can use them when designing the tP product later.

      2 Team Task: Set up a project meeting time by the end of the tutorial

      • After forming teams, set up a weekly project meeting time/venue (and communication channels) with your team members:

      3 Team Task: Check up on team's collective iP status Tue, Sep 3rd

      • Check with all team members if any of them needs help doing the iP, and source within the team to provide the needed help as much as you can e.g., offer to sit with them while they do the iP so that you can try to help when needed.
        Submission: After completing this task (i.e., after asking all team members if they need help for the iP, and coming up with a plan to help those who asked for help), one member should inform your tutor so that we can track the status of this task. We don't need to know who asked for help though e.g., One member is slightly behind and one significantly behind. We plan to have a code-together session on Sunday so that we can help them if they encounter problems.
      Mentorship within the team is highly-encouraged and rewarded. Besides, it is in your interest to help team members level up before the tP coding begins, and also, a good early opportunity to build team spirit.


      tP: Forming TeamstP Week 4: Set direction

      [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
      +Note: The feature suggestions you submit will be shared with the team members later, so that your team can use them when designing the tP product later.

    2 Team Task: Set up a project meeting time by the end of the tutorial

    • After forming teams, set up a weekly project meeting time/venue (and communication channels) with your team members:

    3 Team Task: Check up on team's collective iP status Tue, Sep 3rd

    • Check with all team members if any of them needs help doing the iP, and source within the team to provide the needed help as much as you can e.g., offer to sit with them while they do the iP so that you can try to help when needed.
      Submission: After completing this task (i.e., after asking all team members if they need help for the iP, and coming up with a plan to help those who asked for help), one member should inform your tutor so that we can track the status of this task. We don't need to know who asked for help though e.g., One member is slightly behind and one significantly behind. We plan to have a code-together session on Sunday so that we can help them if they encounter problems.
    Mentorship within the team is highly-encouraged and rewarded. Besides, it is in your interest to help team members level up before the tP coding begins, and also, a good early opportunity to build team spirit.


    tP: Forming TeamstP Week 4: Set direction

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w3.page-vue-render.js b/admin/tp-w3.page-vue-render.js index 51feb3571b..a5191971f1 100644 --- a/admin/tp-w3.page-vue-render.js +++ b/admin/tp-w3.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('ul',[_c('li',[_v("Check with all team members if any of th with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-teams.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP: Forming Teams")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w4.html"}},[_c('span',[_v("tP Week 4: Set direction "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w4.html b/admin/tp-w4.html index 1ced2fd996..1c67291f5c 100644 --- a/admin/tp-w4.html +++ b/admin/tp-w4.html @@ -26,7 +26,7 @@
    • Details to submit:
      1. Product name (plain text only) e.g., ClientContactsPro
      2. Target user profile (plain text only) e.g., freelance event photographers
        This is a general description of the target user, not the 'persona' you defined (the latter serves as a concrete representation of the target user, for your internal use only).
      3. Value proposition i.e., what problem does the product solve? (plain text paragraph, no more than 50 words) e.g., provide fast access to client contact details, optimized for users who prefer a CLI
        -This is not a list of features -- you should not think about exact features yet.
      4. Link to the project notes document: This should be an online document/page (not a folder) -- e.g., a GoogleDoc (not a Google Drive location) -- that is publicly accessible. If your project notes are in multiple locations/files, this one document should contain the link to the other documents with guidance on which link is for what.
    • You'll receive an email from TEAMMATES with the submission link. Only one member needs to submit on behalf of the team. All members can view/update the submission.
    • Submission link will be sent to you by Thu, Sep 5th (reason: we need a few days to set up the submission system after teams have been finalized).
      If you can't find the submission link, you can go to TEAMMATES link recovery page and enter your NUSNET email account e_______@u.nus.edu to get TEAMMATES to resend the link.

    FAQ Can we change the target user and value proposition later in the project?



    tP Week 3: KickofftP Week 5: Gather requirements

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +This is not a list of features -- you should not think about exact features yet.
  • Link to the project notes document: This should be an online document/page (not a folder) -- e.g., a GoogleDoc (not a Google Drive location) -- that is publicly accessible. If your project notes are in multiple locations/files, this one document should contain the link to the other documents with guidance on which link is for what.
  • You'll receive an email from TEAMMATES with the submission link. Only one member needs to submit on behalf of the team. All members can view/update the submission.
  • Submission link will be sent to you by Thu, Sep 5th (reason: we need a few days to set up the submission system after teams have been finalized).
    If you can't find the submission link, you can go to TEAMMATES link recovery page and enter your NUSNET email account e_______@u.nus.edu to get TEAMMATES to resend the link.
  • FAQ Can we change the target user and value proposition later in the project?



    tP Week 3: KickofftP Week 5: Gather requirements

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w4.page-vue-render.js b/admin/tp-w4.page-vue-render.js index 3f28bbae1e..8569fdff92 100644 --- a/admin/tp-w4.page-vue-render.js +++ b/admin/tp-w4.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_c('s with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w3.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 3: Kickoff")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w5.html"}},[_c('span',[_v("tP Week 5: Gather requirements "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w5.html b/admin/tp-w5.html index ce36173daa..282ef36612 100644 --- a/admin/tp-w5.html +++ b/admin/tp-w5.html @@ -33,7 +33,7 @@

  • User stories for what version? At this stage, collect user stories to cover at least the final version you hope to deliver at the end of the semester. It is OK to go even beyond that (reason: we are simulating a project that will continue even after the semester is over).
    Do not omit user stories already covered by the features in AB3 i.e., the user story should be recorded even if AB3 already caters for it.

  • How many user stories? Aim to collect more user stories than you can deliver in the project. Aim to create at least 30 user stories. Include all 'obvious' ones you can think of but also look for 'non obvious' ones that you think are likely to be missed by other competing products.

  • User stories of what size? Normally, it is fine to use epic-level user stories in the early stages of a project but given this is a small project, you may want to eventually break them down to smaller user stories (i.e., small enough for one person to implement in 1-2 days). Some examples (from the iP product domain):

    • Bad As a user, I can track my schedule, so that I can know when to do things.
      Reason: too big, as track can involve a lot of things.
    • Good As a user, I can add a time to a task, so that I can record when a task need to be done.
    • Good As a user, I can see the pending task that has the next earliest deadline, so that I can know what I need to do next.
  • What format?: You may use a sentence format or a table format but do maintain the prescribed three-part structure of a user story. In particular, try to include the benefit part in most user stories as that will come in handy when prioritizing user stories later.

  • Submission (to be checked by the tutor later):

    • Intermediate steps (e.g., persona, scenarios): Keep records these in your collaborative project document started in the previous week.
    • Brainstormed user stories: Record them using an online tool (some examples given in [Textbook Specifying Requirements → UserStories → Usage → (panel) Tool Examples ]).
      Use an online spreadsheet for recording user stories (e.g., Google Sheets), if you are not sure which tool to use. -- they are easy to edit, share, color, and more importantly, sort/filter.
      If you put the user stories in a page/file other than your main collaborative project notes document (i.e., the one given here), ensure that page/file is viewable by the public, and the main document has a link to that page/file. Otherwise, the tutor will not be able to see your list of user stories.
  • If you choose to use the GitHub issue tracker to manage user stories, you need to set up your team's GitHub organization, team repo, and its issue tracker first. Instructions for doing those steps are in the panel below.

    2 Choose user stories for the MVP version before/during the tutorial

    Task: Of the user stories you have collected, select the ones you would put in an version of the product. The goal here is to come up with the smallest possible product that is still usable so that it can be implemented quickly, and delivered at the end of an earlier iteration.

    • Try to limit the MVP to strictly must-have user stories only i.e., it's NOT what you can or want to put in the MVP, but what you must have in the MVP. If the product can be of some use without a given user story, that user story should be left out of the MVP version, even if the omission makes the product hard to use, as long as the product is not impossible to use e.g., in most cases a product can be used without an 'edit item' feature because the user can always delete an item and add a new item instead of editing an existing an item.

    • Do not discuss features, UI, command format, or implementation details yet. That would be like putting the cart before the horse. At this stage we are simply trying to choose which user needs to fulfill first.

    • Don't worry about subsequent versions or the final version. You can design them at a later time.

    • Don't worry about MVP being 'too small'. You can always add more features to the MVP version if you finish it ahead of schedule.
      You can also select an additional set of user stories that are nice-to-have for the MVP, to be done but only if there's time left.

    • In the interest of keeping the MVP small, you can narrow the scope of MVP further e.g., narrower target user, a smaller value proposition.

    • Suggested workflow:

      1. First stage:
        • Divide the user stories among team members.
        • Each member will go through their user stories to discard (e.g., cross out, or move to a different location, but not delete) which are definitely not needed for MVP.
      2. Second stage: -
        • All members discuss the remaining user stories (i.e., the ones not discarded in the first stage), and try to trim the list further.

    FAQ What if the chosen user stories for MVP is not enough to do a meaningful work division among team members?


    FAQ Should we start implementing MVP now?


    FAQ Should we omit user stories that are already supported by AB3?


    FAQ All the user stories we selected for MVP are already supported by AB3. What now?



    tP Week 4: Set directiontP Week 6: Define the MVP

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • All members discuss the remaining user stories (i.e., the ones not discarded in the first stage), and try to trim the list further.

    FAQ What if the chosen user stories for MVP is not enough to do a meaningful work division among team members?


    FAQ Should we start implementing MVP now?


    FAQ Should we omit user stories that are already supported by AB3?


    FAQ All the user stories we selected for MVP are already supported by AB3. What now?



    tP Week 4: Set directiontP Week 6: Define the MVP

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w5.page-vue-render.js b/admin/tp-w5.page-vue-render.js index ba7138e36b..923291fbd8 100644 --- a/admin/tp-w5.page-vue-render.js +++ b/admin/tp-w5.page-vue-render.js @@ -101,6 +101,6 @@ with(this){return _c('li',[_c('p',[_c('strong',[_v("Suggested workflow:")])]),_v with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w4.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 4: Set direction")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w6.html"}},[_c('span',[_v("tP Week 6: Define the MVP "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w6.html b/admin/tp-w6.html index 841e88d97b..1e3e790075 100644 --- a/admin/tp-w6.html +++ b/admin/tp-w6.html @@ -25,7 +25,7 @@
    • Which formats are allowed for dates, times, telephone numbers, etc.?
    • How does extra/leading/trailing spaces affect the value -- for instance is 'John Doe' same as 'John   Doe' (note the multiple spaces in the middle of the name)?
    • How does UPPER/lower case affects values -- is John Doe same as john doe?
    • It's not enough to state 'valid name'; you need to specify what rules will be used to determine if the input is a valid name.
  • Error message if the value is not acceptable
  • Rationale for any the validity rule e.g., why only certain characters are allowed for person names?
  • Yes, making these decisions is not easy -- and that's why we want you to think about them now rather than later. Feel free to discuss these validation rules in the forum.

    Outputs: Precise expected outputs when the command,

    • succeeds e.g., changes in the GUI, messages shown to the user
    • fails e.g., what are the error messages shown when a specific parameter is invalid, missing, specified multiple times, etc.

    Duplicate handling: What rules are used to determine if two contacts are duplicates? e.g., is having the same name enough for two contacts to be considered duplicates, or all details need to be the same?
    How does the application react to such duplicate entries? Reject or accept? Why?

    Relevant UI mock-ups (unless the UI will be exactly the same as AB3): they can be hand-drawn or created using a tool such as PowerPoint, PlantUML, Figma, etc. -- they can be very low-fidelity mock-ups, as they are meant to be temporary


    Recommended: Decide priorities of finer aspects of features, for example, as must-have (to implement in the MVP) and nice-to-have (i.e., to implement in the MVP only if there is time)
    e.g., you can decide one date format that is to be supported in user commands as must-have and two other formats as nice-to-have.

    • It is OK to make compromises when making product decisions -- every design option has costs and benefits, and sometimes, costs outweigh the benefits.
      For example, it is fine to restrict the person name to a certain length and a character set even if it is theoretically possible for those restrictions to conflict with some rare real-world person names. But you need to be aware of such conflicts, justify the restriction (e.g., ease of implementation/display), and know how users can work around such a conflict should they encounter it (e.g., if you app doesn't allow two contacts to have the same name but the user need to store two contacts which are different people with the same name, what should the user do?).

    • You are welcome to (but not required to) follow AB3 when defining the behavior of the new features e.g., use similar command formats, input validation rules, error message formats.

    FAQ Do we need to include existing AB3 features in the MVP feature spec?


    • Ensure feature-fit: While doing this, ensure the features written by each member fit together to form a cohesive product, and meet other grading criteria of the product design aspect. This might require several rounds of refinement. You are encouraged to peer-review feature details written by other team members and refine the overall product design together.

    • Submission [one person per team]: Save the file as a PDF file, name it {team-id}.pdf e.g., CS2103-T09-2.pdf, and upload to Canvas.
    • Grading criteria: to be considered 'done', the feature spec. should meet all the following criteria: -
      • Covers all features in the smallest set of features the product cannot do without.
      • Contains all details mentioned above for each of those features
      • Details seem well-thought-out (i.e., not a half-hearted attempt to satisfy the expected level of details)

    Recommended: Divide among team members so that each person does a non-trivial amount of documentation; preferably based on enhancements/features each person would be adding e.g., If you are the person planing to add a feature X, you should be the person to describe the feature X in the User Guide and in the Developer Guide.

    Reason: In the final project evaluation your documentation skills will be graded based on sections of the User/Developer Guide you wrote.

    If you are not sure what we mean by 'enhancements/features each person would be adding' mentioned above, see the panel below for our recommendation on how to divide the tP work:

    3 Set up the project repo

    1. [/ one member] Set up the team org:
      While only one member needs to do this, it may be useful to do this as a team while that member is screensharing, so that others get to see how it is done too.

    1. [/ one member] Set up the team repo (including the issue tracker):

    1. [ each member] Set up individual forks:

    4 Get familiar with the codebase

    FAQ Is this a team task or an individual task?


    Ideally, you should do this task in this week, but you may take an extra week (i.e., by week 7) to finish.

    • Do the following tutorials to get familiar with the codebase

    Tutorial 1 - Tracing a Command Execution Path

    See here for details.

    We recommend that you put in a sincere effort into this tutorial because tracing through the code of an unfamiliar codebase is an important skill that you can learn by doing so; you will not be able to learn/practice later in the project as the code will no longer be 'unfamiliar' to you later.

    Submission [optional]: Post an issue in your team's repo with the title Tutorial: tracing code. In the description, add a 2-3 screenshots you took while at various points of the tutorial. You may close the issue soon after.


    Tutorial 2 - Adding a new Command

    See here for details.

    If you are an experienced programmer, you can add a different command than the one given in the tutorial.

    Submission: Do your changes in a branch named tutorial-adding-command, push to your fork, and create a PR from your fork's tutorial-adding-command branch to your team repo's master branch. You may close the PR soon after.

    FAQ When doing this tP tutorial, do we have to write/update test cases too?



    Tutorial 3 - Removing a field from an entity

    See here for details.

    This tutorial is optional to do, but at least give it a quick read.

    Submission: not required.



    tP Week 5: Gather requirementstP Week 7: Practice iteration → v1.1

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Covers all features in the smallest set of features the product cannot do without.
    • Contains all details mentioned above for each of those features
    • Details seem well-thought-out (i.e., not a half-hearted attempt to satisfy the expected level of details)

    Recommended: Divide among team members so that each person does a non-trivial amount of documentation; preferably based on enhancements/features each person would be adding e.g., If you are the person planing to add a feature X, you should be the person to describe the feature X in the User Guide and in the Developer Guide.

    Reason: In the final project evaluation your documentation skills will be graded based on sections of the User/Developer Guide you wrote.

    If you are not sure what we mean by 'enhancements/features each person would be adding' mentioned above, see the panel below for our recommendation on how to divide the tP work:

    3 Set up the project repo

    1. [/ one member] Set up the team org:
      While only one member needs to do this, it may be useful to do this as a team while that member is screensharing, so that others get to see how it is done too.

    1. [/ one member] Set up the team repo (including the issue tracker):

    1. [ each member] Set up individual forks:

    4 Get familiar with the codebase

    FAQ Is this a team task or an individual task?


    Ideally, you should do this task in this week, but you may take an extra week (i.e., by week 7) to finish.

    • Do the following tutorials to get familiar with the codebase

    Tutorial 1 - Tracing a Command Execution Path

    See here for details.

    We recommend that you put in a sincere effort into this tutorial because tracing through the code of an unfamiliar codebase is an important skill that you can learn by doing so; you will not be able to learn/practice later in the project as the code will no longer be 'unfamiliar' to you later.

    Submission [optional]: Post an issue in your team's repo with the title Tutorial: tracing code. In the description, add a 2-3 screenshots you took while at various points of the tutorial. You may close the issue soon after.


    Tutorial 2 - Adding a new Command

    See here for details.

    If you are an experienced programmer, you can add a different command than the one given in the tutorial.

    Submission: Do your changes in a branch named tutorial-adding-command, push to your fork, and create a PR from your fork's tutorial-adding-command branch to your team repo's master branch. You may close the PR soon after.

    FAQ When doing this tP tutorial, do we have to write/update test cases too?



    Tutorial 3 - Removing a field from an entity

    See here for details.

    This tutorial is optional to do, but at least give it a quick read.

    Submission: not required.



    tP Week 5: Gather requirementstP Week 7: Practice iteration → v1.1

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w6.page-vue-render.js b/admin/tp-w6.page-vue-render.js index c2689c5d67..751e448740 100644 --- a/admin/tp-w6.page-vue-render.js +++ b/admin/tp-w6.page-vue-render.js @@ -89,6 +89,6 @@ with(this){return _c('ul',[_c('li',[_v("Do the following tutorials to get famili with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w5.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 5: Gather requirements")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w7.html"}},[_c('span',[_v("tP Week 7: Practice iteration → v1.1 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w7.html b/admin/tp-w7.html index eeb01bd05d..e98ada0cdf 100644 --- a/admin/tp-w7.html +++ b/admin/tp-w7.html @@ -34,7 +34,7 @@ Note that the image of the UI should be docs/images/Ui.png so that it can be downloaded by our scripts. Limit the file to contain one screenshot/mockup only and ensure the new image is roughly the same height x width proportions as the original one. Reason: when we compile these images from all teams into one page (example), yours should not look out of place.
    The UI mock up can be a hand-drawn sketch or created using a tool such as PowerPoint, PlantUML, Figma, etc. Don't spend a lot of time on this, as this will eventually be replaced by a screenshot of the actual product.
    Can we use an AB3 screenshot for this? Only in the unlikely case that your final product UI is expected to look exactly the same as AB3.
  • Update the link of the GitHub Actions build status badge (Build Status) so that it reflects the build status of your team repo.
  • Acknowledge the original source of the code e.g.,
    This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
  • Update all remaining contents of the page to match your own project.
  • If you did the above updates correctly, your UI mock up and profile photos should appear in your project website and this Project List Page.

    B: Also update site-wide settings, as necessary:

    • You need to update the AB-3 in the top navigation bar of your project website (it's in docs\_config.yml and docs/_sass/minima/_base.scss if using Jekyll; in docs\_markbind\layouts\default.md if using MarkBind).

    • More info on updating site-wide settings such as the above:

    3 Update the DG: user stories, glossary, NFRs, use cases

    • Add the following to the DG, based on your project notes from the previous weeks. No need to update other sections, for now.
      Some examples of these can be found in the AB3 Developer Guide.

      • Target user profile, value proposition, and user stories: Update the target user profile and value proposition to match the project direction you have selected. Give a list of the user stories (and update/delete existing ones, if applicable), including priorities. This can include user stories considered but will not be included in the final product.
      • Use cases: Give a few representative use cases (textual form) that need multiple steps to complete. e.g. Adding a tag to a person (assume the user needs to find the person first)
      • Non-functional requirements: Note: Many of the given project constraints can be considered NFRs. You can add more. e.g. performance requirements, usability requirements, scalability requirements, etc.
      • Glossary: Define terms that are worth recording.

    The above DG sections should cover the full requirements of the product, some of which might not even get implemented by the end of this semester i.e., do not limit to just the requirements you intend to implement in the next iteration. Reason: All identified requirements need to be documented for future reference.

    Furthermore, these sections will be graded at the final project evaluation, and any bugs in the content can cost you marks at that point. The panel below gives some relevant DG bug examples you can lookout for:

    4 Start the next iteration

    • Stronger teams are welcome to stay one week ahead of the tP schedule. -So, feel free to move on to next week's tp tasks, and get started on the next iteration (i.e., v1.2).


    tP Week 6: Define the MVPtP Week 8: First feature increment → v1.2

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +So, feel free to move on to next week's tp tasks, and get started on the next iteration (i.e., v1.2).


    tP Week 6: Define the MVPtP Week 8: First feature increment → v1.2

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w7.page-vue-render.js b/admin/tp-w7.page-vue-render.js index 8b1ed438ee..c80dd3e1f6 100644 --- a/admin/tp-w7.page-vue-render.js +++ b/admin/tp-w7.page-vue-render.js @@ -134,6 +134,6 @@ with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',{staticClass:"text-suc with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w6.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 6: Define the MVP")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w8.html"}},[_c('span',[_v("tP Week 8: First feature increment → v1.2 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w8.html b/admin/tp-w8.html index c4da135381..7f5001d1a7 100644 --- a/admin/tp-w8.html +++ b/admin/tp-w8.html @@ -39,7 +39,7 @@ This code change should not 'break' the code base though (e.g., it should not refer to a class that you plan to add in a future PR but doesn't exist yet). Ideally, it should not cause any existing tests to break either. That is, the change should take the codebase forward in a meaningful way.
  • Implement that code change while following the workflow that you practiced in the previous week. A summary of the steps:
    • Create an issue for it. Assign it to yourself. Assign it to milestone v1.2.
    • Create a PR from a separate branch in your fork. Assign it to v1.2.
    • Get the PR reviewed.
    • Get the PR merged. Close the corresponding issue.
  • Continue to implement more code changes (i.e., repeat S1 and S2) to implement more code changes that move you towards your MVP feature(s). Recommended to create , when implementing code changes with no/low dependency between them.
  • Wrap up the milestone When the iteration period is over, do the following:
    • Move any pending issues/PRs to the next milestone (i.e., v1.3). As we did not plan to release a product version at the end of this iteration, we can freely move any pending work to the next iteration.
    • Close the milestone.
    • There is no need to do a product release.
  • FAQ How much code changes is 'enough' for this iteration?


    FAQ What if we overshoot the deadline for a tP iteration?


    FAQ Do we have to update tests when we update functional code?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Can we PR against a branch other than master, and merge that branch to master in a later iteration?


    FAQ Do we need to update user/developer guides to match code changes?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    End of tP Week 8

    Shocked by iP to tP transition? Around this time you will realize how the speed you can implement things in the tP is significantly slower compared to the iP. As discouraging as this might feel, there are several ways this can contribute towards the learning outcomes of this course, and it is not expected to affect your tP grade either.

    More on this ...


    Feel free to improve AB3 in any way you see fit. While not very 'buggy', AB3 is not 'perfect' either (it is not meant to be a 'model solution'). In particular, find and fix any bugs it has. If you are not sure if something is a bug or an intended behavior, you can post in the forum to check.
    -While we are on the topic, also note that the architecture of AB3 doesn't suit every kind of application either. As you gain more experience in other application domains, you will learn different types of architectures that you can add to the collection of different architectures that you can consider for future projects. The same goes for the tool chain and the tech stack of AB3. Therefore, do not try to apply AB3 as a template for every other project you encounter in the future.


    tP Week 7: Practice iteration → v1.1tP Week 9: MVP → v1.3

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +While we are on the topic, also note that the architecture of AB3 doesn't suit every kind of application either. As you gain more experience in other application domains, you will learn different types of architectures that you can add to the collection of different architectures that you can consider for future projects. The same goes for the tool chain and the tech stack of AB3. Therefore, do not try to apply AB3 as a template for every other project you encounter in the future.


    tP Week 7: Practice iteration → v1.1tP Week 9: MVP → v1.3

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w8.page-vue-render.js b/admin/tp-w8.page-vue-render.js index 7eef339fa7..b38fa253d2 100644 --- a/admin/tp-w8.page-vue-render.js +++ b/admin/tp-w8.page-vue-render.js @@ -71,6 +71,6 @@ with(this){return _c('h4',{attrs:{"id":"end-of-tp-week-8"}},[_c('strong',[_c('st with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w7.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 7: Practice iteration → v1.1")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w9.html"}},[_c('span',[_v("tP Week 9: MVP → v1.3 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tp-w9.html b/admin/tp-w9.html index cbb6e6e6e6..1f9aeae03a 100644 --- a/admin/tp-w9.html +++ b/admin/tp-w9.html @@ -24,7 +24,7 @@

    tP Week 8: First feature increment → v1.2tP Week 10: Alpha version → v1.4


    tP Week 9: MVP → v1.3

    1. Plan the first product release (v1.3)
    2. Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    Intro to tP Week 9

    What's happening this week:

    This week, we deliver the first working version of the product (i.e., the MVP), thus finishing what we started in the previous iteration.

    v1.3 (MVP)

    • Learning outcome: Able to deliver a fully working product, on time.
    • Product goal: Reach the .
    • Strategy: Decide on a plan to meet the MVP delivery deadline. Reduce risk by aiming for the smallest subset of must-have features.

    As per the learning outcome of this iteration (given above), our focus is on delivering a product on time. So, in task 1, we start by setting up a plan to reach that goal, and then execute on it in task 2 , while making course corrections as we go (if needed).

    Things to note:

    Iteration vs milestone vs version:

    An iteration can aim to reach zero or more milestones, some of which can be the release of a product version. So, they are three different things.
    For convenience, the tP uses a version number to refer to all three. For example, when we say iteration v1.3, we mean the iteration that ends in the milestone v1.3 (that also happens to deliver the product version v1.3).

    How to define version numbers?

    While there is no universal set of rules on choosing version numbers for a product, there is a convention named SemVer that is well-defined and widely used. Our tP version numbers (v1.3, v1.5, v1.6 etc.) do not follow SemVer strictly though.

    This is your first 'proper' iteration that delivers a product. Ensure you remember how you are expected to 'manage' an iteration (graded), given in the panel below:

    1 Plan the first product release (v1.3)

    Note that the product you deliver at the end of this iteration must be working although the functionality is basic.

    • Revise the iteration target, if necessary e.g., if v1.2 iteration felt like your progress is much slower than you anticipated, you can explore if MVP can be trimmed-down even further, to increase your chances of reaching it in time.
    • Enumerate the plan: decide tasks, order, timeline.
      1. Figure out what tasks needs to be done to reach v1.3 product version.
      2. Decide if there is a certain order in which they need to be done (based on dependencies between them)
      3. Decide the timeline on which you need to finish each.
    • Document the plan: create issues, assign milestone, and members.
      1. Create issues to match the tasks you enumerated above.
        In the issue description, you can mention when a task needs to be done (e.g., due: Monday). Alternatively, you can create a bunch of labels for recording due dates (e.g., due:Monday)
      2. Assign them to the milestone v1.3.
      3. Assign each of those issues to the person responsible for doing it.

    2 Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    Ways to level up your tP game:

    • Consider updating the UG as you go. As you implement a feature/enhancement, consider updating the user guide (UG) to match the new behavior.
    • Start reviewing each other's PRs seriously, and giving thoughtful review comments (i.e., as opposed to approving after a superficial look), if you haven't done so already.

    • Manage the iteration v1.3, and reach the milestone v1.3 (which delivers product version v1.3)
    • Aim to delivery on time, as that is linked to our tP learning outcome of this iteration. This means you need to monitor progress, and course-correct as you go.
      • Revise the MVP design further, if needed. If you think some of the ongoing work intended for the current iteration may not finish in time, you can reassign them to a future iteration, provided they are not essential for the v1.3 (i.e., you can still get a 'working product' without them).
      • or issues/PR accordingly.
    • Do a release on GitHub, when the product v1.3 is ready. Requirements: -
      • Write a fairly detailed Release Note in the text field GitHub provides for the description of the release. In particular, describe what has been changed (compared to AB3). This is just an itemized list of What's New -- no need to be as elaborate as a user guide.
        Include screenshots (or screen recordings) of your product in action, featuring the changes you've done.
        These release notes will be checked by the teaching team to verify (a) that they are written reasonably well, and, (b) that the features mentioned in there show the product has reached the MVP level of functionality.
      • Upload the JAR file as well. Instructions for creating a JAR file can be found in as described in the tP Developer Guide.
    • Wrap up the milestone on GitHub, when you are done with this iteration and the MVP has been released.

    FAQ Should we try to automate GUI testing as well?


    FAQ All tests pass locally, but the same code fails CI in the PR. How come?


    FAQ PR passed CI before merging, but fails CI after merging. How come?


    Some other relevant FAQs, repeated from last week:

    FAQ Do we have to update tests when we update functional code?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Can we PR against a branch other than master, and merge that branch to master in a later iteration?


    FAQ Do we need to update user/developer guides to match code changes?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    End of tP Week 9

    Phew! Hope your first product release went well, and was on time. If it didn't, not to worry; we have more tries to get it right.

    For now, give some thoughts to the following questions (the answer will be needed for an activity in the next iteration):

    • Were you able to deliver on time? If not, why?
    • How do initial effort estimations compare to actual effort? Took more or less effort than anticipated?

    tP Week 8: First feature increment → v1.2tP Week 10: Alpha version → v1.4

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Write a fairly detailed Release Note in the text field GitHub provides for the description of the release. In particular, describe what has been changed (compared to AB3). This is just an itemized list of What's New -- no need to be as elaborate as a user guide.
      Include screenshots (or screen recordings) of your product in action, featuring the changes you've done.
      These release notes will be checked by the teaching team to verify (a) that they are written reasonably well, and, (b) that the features mentioned in there show the product has reached the MVP level of functionality.
    • Upload the JAR file as well. Instructions for creating a JAR file can be found in as described in the tP Developer Guide.
  • Wrap up the milestone on GitHub, when you are done with this iteration and the MVP has been released.
  • FAQ Should we try to automate GUI testing as well?


    FAQ All tests pass locally, but the same code fails CI in the PR. How come?


    FAQ PR passed CI before merging, but fails CI after merging. How come?


    Some other relevant FAQs, repeated from last week:

    FAQ Do we have to update tests when we update functional code?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Can we PR against a branch other than master, and merge that branch to master in a later iteration?


    FAQ Do we need to update user/developer guides to match code changes?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    End of tP Week 9

    Phew! Hope your first product release went well, and was on time. If it didn't, not to worry; we have more tries to get it right.

    For now, give some thoughts to the following questions (the answer will be needed for an activity in the next iteration):

    • Were you able to deliver on time? If not, why?
    • How do initial effort estimations compare to actual effort? Took more or less effort than anticipated?

    tP Week 8: First feature increment → v1.2tP Week 10: Alpha version → v1.4

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tp-w9.page-vue-render.js b/admin/tp-w9.page-vue-render.js index 56f9d99e0d..cabdd60831 100644 --- a/admin/tp-w9.page-vue-render.js +++ b/admin/tp-w9.page-vue-render.js @@ -71,6 +71,6 @@ with(this){return _c('div',[_c('div',{staticClass:"border border-success pt-2 ps with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w8.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" tP Week 8: First feature increment → v1.2")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/tp-w10.html"}},[_c('span',[_v("tP Week 10: Alpha version → v1.4 "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tutorials.html b/admin/tutorials.html index f353aa19f7..333a6cb8ca 100644 --- a/admin/tutorials.html +++ b/admin/tutorials.html @@ -26,7 +26,7 @@ Please help to keep the noise level low (as there are two parallel tutorials in the same venue),
    (a) by limiting conversations to parts that the tutor directs you to have a discussion,
    (b) and not speaking too loudly during those discussions.

    FAQ Are you allowed to attend the tutorial via Zoom instead?


    FAQ What happens if I join a tutorial via Zoom, without getting permission to do so?


    Course Venue Time Tutorial ID
    in Canvas

    (don't use this!)
    Our Tutorial ID
    (use this!)
    Tutor
    of teams 1,2
    Tutor
    of teams 3,4
    CS2103T COM3-01-20 Wed 08:00 G03 CS2103T-W08 Joel Prabhu
    CS2103T COM3-01-20 Wed 09:00 G01 CS2103T-W09 Jiu Fong Michael
    CS2103T COM3-01-20 Wed 10:00 G04 CS2103T-W10 Merrick Prabhu
    CS2103T COM3-01-20 Wed 11:00 G07 CS2103T-W11 Jun Yi Dillon
    CS2103T COM3-01-20 Wed 12:00 G20 CS2103T-W12 Jiu Fong Michael
    CS2103T COM3-01-20 Wed 13:00 G08 CS2103T-W13 Melissa Michael
    CS2103T COM3-01-20 Wed 14:00 G23 CS2103T-W14 Reyaaz Yi Teng
    CS2103T COM3-01-20 Thu 08:00 G12 CS2103T-T08 Jin Yuan Tania
    CS2103T COM3-01-20 Thu 09:00 G10 CS2103T-T09 Khang Hou Billy
    CS2103T COM3-01-20 Thu 10:00 G21 CS2103T-T10 Hui Xuan Yue Ran
    CS2103T COM3-01-20 Thu 11:00 G15 CS2103T-T11 Xiao Yun Rithik
    CS2103T COM3-01-20 Thu 12:00 G05 CS2103T-T12 Timothy Anis
    CS2103T COM3-01-20 Thu 13:00 G02 CS2103T-T13 Zong Xun Anis
    CS2103T COM3-01-20 Thu 14:00 G22 CS2103T-T14 Wayne Ha Thu
    CS2103T COM3-01-20 Thu 15:00 G24 CS2103T-T15 Richie Yi Teng
    CS2103T COM3-01-20 Thu 16:00 G25 CS2103T-T16 Dinghao Anis
    CS2103T COM3-01-20 Thu 17:00 G11 CS2103T-T17 Reyaaz Aditya
    CS2103T COM3-01-20 Fri 08:00 G06 CS2103T-F08 Danny Shuyao
     CS2103  COM1-0210 Fri 09:00 03 CS2103-F09 Jiu Fong Danny
    CS2103T COM3-01-20 Fri 09:00 G18 CS2103T-F09 Wei Zhe Yuheng
     CS2103  COM1-0210 Fri 10:00 02 CS2103-F10 Gallen Hui Xuan
    CS2103T COM3-01-20 Fri 10:00 G09 CS2103T-F10 Marcus Lynnette
     CS2103  COM1-0210 Fri 11:00 01 CS2103-F11 Isaac
    CS2103T COM3-01-20 Fri 11:00 G16 CS2103T-F11 Ashley Danny
     CS2103  COM1-0210 Fri 12:00 04 CS2103-F12 Reyaaz Danny
    CS2103T COM3-01-20 Fri 12:00 G19 CS2103T-F12 Kyal Chan How
     CS2103  COM1-0210 Fri 13:00 05 CS2103-F13 Yong Jing Junwu
    CS2103T COM3-01-20 Fri 13:00 G13 CS2103T-F13 Elton Yue Ran
    CS2103T COM3-01-20 Fri 14:00 G14 CS2103T-F14a Yan Jie Fikri
    CS2103T COM1-0210 Fri 14:00 G26 CS2103T-F14b Yong Jing Yu Cong
    CS2103T COM3-01-20 Fri 15:00 G17 CS2103T-F15 Si Kai Danny

    Tutorial Structure

    The mode
    • The initial few tutorials will be through Zoom; the rest will be F2F.
    • A tutorial group is handled by two tutors. Each tutor will work with two teams.
    • Zoom will be used (even during F2F tutorials) for projecting slides and collecting chat responses.
    • MS Teams will be used for file sharing.

    Slides and recordings
    • The Zoom recording of a tutorial will be made available to you after the tutorial.
    • Slides used in tutorials will not be distributed to students. You are expected to take notes (or screenshots) during the tutorial as necessary. Reasons: -
      1. Tutorial slides are meant to help the tutor deliver the tutorial, and not meant to be used as reference materials for you to study later). When some content is suitable as a reference material, we'll provide you a copy of it.
      2. To encourage some level of active engagement with the materials (e.g., taking notes) which is known to increase retention.
      3. To discourage 'no need to bother now; can look at the slides near the exam' attitude -- because most of the materials covered in tutorials are applicable to the project immediately.
    Tutor's role

    The role of our tutor's is different from tutors in other courses.

    • Not a source of admin information, as per the course policy given below:

    • No feedback/help for yet-to-be-graded components: Tutors are prohibited from giving inputs for components not graded yet, as per the course policy given below:

    • No direct tech help: Tutors are prohibited from giving direct technical help, other than to give you some general direction to finding a solution. Rationale: We want you to learn the vital survival skill of troubleshooting technical problems.

    Admin Appendix D: How to get Help in CS2103/T


    • No ‘mini-lectures’: Tutors are prohibited from 'teaching' concepts that are covered in the learning resources given to you (reason: self-learning is a vital part of the course). For example, the tutor will not do a mini-lecture at the start of the tutorial. But tutors can help you clarify doubts about topics covered in the tutorial.

    FAQ What kind of questions can I ask the tutor?


    Timing/venue:
    • Please refer to the Weekly Schedule Page (click on the Tutorial tab) for further details on each tutorial.

    FAQ Can the tutorial be made longer (e.g., 2 hours)?


    Grading:
    • Your conduct in tutorials will be evaluated by team members and the tutor which can affect your Participation marks.
    • You are expected to be present on time. Punctuality is considered for participation marks.

    FAQ What if I can't attend a tutorial due to a valid reason (e.g., MC)?


    FAQ What if I can't attend a tutorial due to another commitment (e.g., interview)?




    Weekly BriefingsInstructors

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    1. Tutorial slides are meant to help the tutor deliver the tutorial, and not meant to be used as reference materials for you to study later). When some content is suitable as a reference material, we'll provide you a copy of it.
    2. To encourage some level of active engagement with the materials (e.g., taking notes) which is known to increase retention.
    3. To discourage 'no need to bother now; can look at the slides near the exam' attitude -- because most of the materials covered in tutorials are applicable to the project immediately.
    Tutor's role

    The role of our tutor's is different from tutors in other courses.

    • Not a source of admin information, as per the course policy given below:

    • No feedback/help for yet-to-be-graded components: Tutors are prohibited from giving inputs for components not graded yet, as per the course policy given below:

    • No direct tech help: Tutors are prohibited from giving direct technical help, other than to give you some general direction to finding a solution. Rationale: We want you to learn the vital survival skill of troubleshooting technical problems.

    Admin Appendix D: How to get Help in CS2103/T


    • No ‘mini-lectures’: Tutors are prohibited from 'teaching' concepts that are covered in the learning resources given to you (reason: self-learning is a vital part of the course). For example, the tutor will not do a mini-lecture at the start of the tutorial. But tutors can help you clarify doubts about topics covered in the tutorial.

    FAQ What kind of questions can I ask the tutor?


    Timing/venue:
    • Please refer to the Weekly Schedule Page (click on the Tutorial tab) for further details on each tutorial.

    FAQ Can the tutorial be made longer (e.g., 2 hours)?


    Grading:
    • Your conduct in tutorials will be evaluated by team members and the tutor which can affect your Participation marks.
    • You are expected to be present on time. Punctuality is considered for participation marks.

    FAQ What if I can't attend a tutorial due to a valid reason (e.g., MC)?


    FAQ What if I can't attend a tutorial due to another commitment (e.g., interview)?




    Weekly BriefingsInstructors

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tutorials.page-vue-render.js b/admin/tutorials.page-vue-render.js index 85d7c31b7d..e47bd40f6d 100644 --- a/admin/tutorials.page-vue-render.js +++ b/admin/tutorials.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"tutorials"}},[_c('span',{staticClass:"di with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/lectures.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Weekly Briefings")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_v("Instructors "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/tutors-info.html b/admin/tutors-info.html index ffd5cab4f4..05fae0515b 100644 --- a/admin/tutors-info.html +++ b/admin/tutors-info.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Staff

    Damith Chatura RAJAPAKSE

    Course Coordinator
    damith[at]comp.nus.edu.sg
    COM2-02-57 | 6516 4359
    https://www.comp.nus.edu.sg/~damithch | @damithc


    Michael D. Adams

    Co-Lecturer
    adamsmd[at]nus.edu.sg
    COM3‐02‐47
    @adamsmd


    Prabhu NATARAJAN

    Co-Lecturer
    prabhu[at]comp.nus.edu.sg
    COM3-02-34 | 6516 1105
    @prabhu-na


    Kim hyeongcheol (Danny)

    Head TA
    dcskh[at]nus.edu.sg
    8750 5674
    @bluesky0911


    Anis Bin Yusof

    Graduate Tutor
    anis[at]comp.nus.edu.sg
    6516 8557
    @anisyusof-sc

    Tutors

    1. Aditya

    BAJAJ ADITYA
    e1070584[at]u.nus.edu
    @AdityaB4


    2. Ashley

    ASHLEY CHANG LE XUAN
    e0958221[at]u.nus.edu
    @ashleyclx


    3. Billy

    BILLY HO CHENG EN
    e0958176[at]u.nus.edu
    @billyhoce


    4. Chan How

    CHONG CHAN HOW
    e0969803[at]u.nus.edu
    @ChillinRage


    5. Dillon

    TAN KAH HO DILLON
    e0958762[at]u.nus.edu
    @dillontkh


    6. Dinghao

    SIM DING HAO
    e0958218[at]u.nus.edu
    @DingBao-sys


    7. Elton

    Chua Meng Yong Elton
    e0725906[at]u.nus.edu
    @notle1706


    8. Fikri

    MUHAMMAD FIKRI BIN ABDUL KALAM
    e0970206[at]u.nus.edu
    @mfjkri


    9. Gallen

    GALLEN ONG KAI BIN
    e0958202[at]u.nus.edu
    @gongg21


    10. Ha Thu

    TRAN HA THU
    e0969496[at]u.nus.edu
    @oeggy03


    11. Hui Xuan

    TAN HUI XUAN
    e0775523[at]u.nus.edu
    @huixuant


    12. Isaac

    ONG KOK YEE ISAAC
    e0373113[at]u.nus.edu
    @cocoanautz


    13. Jin Yuan

    NG JIN YUAN
    e0775530[at]u.nus.edu
    @jnjy


    14. Jiu Fong

    LAM JIU FONG
    e0960521[at]u.nus.edu
    @LamJiuFong


    15. Joel

    JOEL GOH MIN FENG
    e0957940[at]u.nus.edu
    @joelgoh1


    16. Jun Yi

    GOH JUN YI
    e0726438[at]u.nus.edu
    @Junyi00


    17. Junwu

    WANG JUNWU
    e1032464[at]u.nus.edu
    @narwhalsilent


    18. Khang Hou

    TAN KHANG HOU
    e1067145[at]u.nus.edu
    @tankh99


    19. Kyal

    KYAL SIN MIN THET
    e0969846[at]u.nus.edu
    @marcus-ny


    20. Lynnette

    ONG XIN HUI LYNNETTE
    e0968030[at]u.nus.edu
    @lynnetteeee


    21. Marcus

    SOH ZHENG YANG, MARCUS
    e0957429[at]u.nus.edu
    @HollaG


    22. Melissa

    Melissa Anastasia Harijanto
    e0851434[at]u.nus.edu
    @melissaharijanto


    23. Merrick

    MERRICK NEO KAI JIE
    e0726513[at]u.nus.edu
    @Merrickneo


    24. Reyaaz

    MUHAMMAD REYAAZ BIN ABDUL BASHEER
    e0544058[at]u.nus.edu
    @ARPspoofing


    25. Richie

    RICHIE HSIEH
    e0957714[at]u.nus.edu
    @richiehx


    26. Rithik

    RAMU RITHIK VIJAY
    e0969886[at]u.nus.edu
    @papataco14


    27. Shuyao

    XU SHUYAO
    e1088140[at]u.nus.edu
    @Tim-Siu


    28. Si Kai

    Chang Si Kai
    e0725915[at]u.nus.edu
    @sikai00


    29. Tania

    TANIA TAN SHU QI
    e0969220[at]u.nus.edu
    @taniatsq


    30. Timothy

    TIMOTHY PUTRA PRASETIO
    e0960320[at]u.nus.edu
    @tim-pipi


    31. Wayne

    Wayne Zhang Si Yuan
    e0726154[at]u.nus.edu
    @waynezsy


    32. Wei Zhe

    TAN WEI ZHE
    e0725610[at]u.nus.edu
    @wz2k


    33. Xiao Yun

    WU XIAOYUN
    e0702008[at]u.nus.edu
    @wxiaoyun


    34. Yan Jie

    NG YAN JIE
    e0969516[at]u.nus.edu
    @logical-1985516


    35. Yi Teng

    Tee Yi Teng
    e0725799[at]u.nus.edu
    @Puakii


    36. Yong Jing

    GOH YONG JING
    e0693145[at]u.nus.edu
    @gohyongjing


    37. Yu Cong

    KOO YU CONG
    e0960480[at]u.nus.edu
    @yucongkoo


    38. Yue Ran

    KANG YUE RAN
    e0695185[at]u.nus.edu
    @kyueran


    39. Yuheng

    GUO YUHENG
    e0958572[at]u.nus.edu
    @DistractedCat


    40. Zong Xun

    LEE ZONG XUN
    e0725594[at]u.nus.edu
    @Zxun2


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Staff

    Damith Chatura RAJAPAKSE

    Course Coordinator
    damith[at]comp.nus.edu.sg
    COM2-02-57 | 6516 4359
    https://www.comp.nus.edu.sg/~damithch | @damithc


    Michael D. Adams

    Co-Lecturer
    adamsmd[at]nus.edu.sg
    COM3‐02‐47
    @adamsmd


    Prabhu NATARAJAN

    Co-Lecturer
    prabhu[at]comp.nus.edu.sg
    COM3-02-34 | 6516 1105
    @prabhu-na


    Kim hyeongcheol (Danny)

    Head TA
    dcskh[at]nus.edu.sg
    8750 5674
    @bluesky0911


    Anis Bin Yusof

    Graduate Tutor
    anis[at]comp.nus.edu.sg
    6516 8557
    @anisyusof-sc

    Tutors

    1. Aditya

    BAJAJ ADITYA
    e1070584[at]u.nus.edu
    @AdityaB4


    2. Ashley

    ASHLEY CHANG LE XUAN
    e0958221[at]u.nus.edu
    @ashleyclx


    3. Billy

    BILLY HO CHENG EN
    e0958176[at]u.nus.edu
    @billyhoce


    4. Chan How

    CHONG CHAN HOW
    e0969803[at]u.nus.edu
    @ChillinRage


    5. Dillon

    TAN KAH HO DILLON
    e0958762[at]u.nus.edu
    @dillontkh


    6. Dinghao

    SIM DING HAO
    e0958218[at]u.nus.edu
    @DingBao-sys


    7. Elton

    Chua Meng Yong Elton
    e0725906[at]u.nus.edu
    @notle1706


    8. Fikri

    MUHAMMAD FIKRI BIN ABDUL KALAM
    e0970206[at]u.nus.edu
    @mfjkri


    9. Gallen

    GALLEN ONG KAI BIN
    e0958202[at]u.nus.edu
    @gongg21


    10. Ha Thu

    TRAN HA THU
    e0969496[at]u.nus.edu
    @oeggy03


    11. Hui Xuan

    TAN HUI XUAN
    e0775523[at]u.nus.edu
    @huixuant


    12. Isaac

    ONG KOK YEE ISAAC
    e0373113[at]u.nus.edu
    @cocoanautz


    13. Jin Yuan

    NG JIN YUAN
    e0775530[at]u.nus.edu
    @jnjy


    14. Jiu Fong

    LAM JIU FONG
    e0960521[at]u.nus.edu
    @LamJiuFong


    15. Joel

    JOEL GOH MIN FENG
    e0957940[at]u.nus.edu
    @joelgoh1


    16. Jun Yi

    GOH JUN YI
    e0726438[at]u.nus.edu
    @Junyi00


    17. Junwu

    WANG JUNWU
    e1032464[at]u.nus.edu
    @narwhalsilent


    18. Khang Hou

    TAN KHANG HOU
    e1067145[at]u.nus.edu
    @tankh99


    19. Kyal

    KYAL SIN MIN THET
    e0969846[at]u.nus.edu
    @marcus-ny


    20. Lynnette

    ONG XIN HUI LYNNETTE
    e0968030[at]u.nus.edu
    @lynnetteeee


    21. Marcus

    SOH ZHENG YANG, MARCUS
    e0957429[at]u.nus.edu
    @HollaG


    22. Melissa

    Melissa Anastasia Harijanto
    e0851434[at]u.nus.edu
    @melissaharijanto


    23. Merrick

    MERRICK NEO KAI JIE
    e0726513[at]u.nus.edu
    @Merrickneo


    24. Reyaaz

    MUHAMMAD REYAAZ BIN ABDUL BASHEER
    e0544058[at]u.nus.edu
    @ARPspoofing


    25. Richie

    RICHIE HSIEH
    e0957714[at]u.nus.edu
    @richiehx


    26. Rithik

    RAMU RITHIK VIJAY
    e0969886[at]u.nus.edu
    @papataco14


    27. Shuyao

    XU SHUYAO
    e1088140[at]u.nus.edu
    @Tim-Siu


    28. Si Kai

    Chang Si Kai
    e0725915[at]u.nus.edu
    @sikai00


    29. Tania

    TANIA TAN SHU QI
    e0969220[at]u.nus.edu
    @taniatsq


    30. Timothy

    TIMOTHY PUTRA PRASETIO
    e0960320[at]u.nus.edu
    @tim-pipi


    31. Wayne

    Wayne Zhang Si Yuan
    e0726154[at]u.nus.edu
    @waynezsy


    32. Wei Zhe

    TAN WEI ZHE
    e0725610[at]u.nus.edu
    @wz2k


    33. Xiao Yun

    WU XIAOYUN
    e0702008[at]u.nus.edu
    @wxiaoyun


    34. Yan Jie

    NG YAN JIE
    e0969516[at]u.nus.edu
    @logical-1985516


    35. Yi Teng

    Tee Yi Teng
    e0725799[at]u.nus.edu
    @Puakii


    36. Yong Jing

    GOH YONG JING
    e0693145[at]u.nus.edu
    @gohyongjing


    37. Yu Cong

    KOO YU CONG
    e0960480[at]u.nus.edu
    @yucongkoo


    38. Yue Ran

    KANG YUE RAN
    e0695185[at]u.nus.edu
    @kyueran


    39. Yuheng

    GUO YUHENG
    e0958572[at]u.nus.edu
    @DistractedCat


    40. Zong Xun

    LEE ZONG XUN
    e0725594[at]u.nus.edu
    @Zxun2


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/tutors-info.page-vue-render.js b/admin/tutors-info.page-vue-render.js index 6eb27e695d..33b515ff7c 100644 --- a/admin/tutors-info.page-vue-render.js +++ b/admin/tutors-info.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h2',{attrs:{"id":"staff"}},[_v("Staff"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#staff","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Damith"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"/website/admin/images/damith.png","width":"150"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"damith-chatura-rajapakse"}},[_c('strong',[_v("Damith")]),_v(" Chatura RAJAPAKSE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#damith-chatura-rajapakse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Course Coordinator")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("damith")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("comp.nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" COM2-02-57 | "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 6516 4359"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-home",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~damithch"}},[_v("https://www.comp.nus.edu.sg/~damithch")]),_v(" | "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/damithc"}},[_v("@damithc")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Michael"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/adamsmd.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"michael-d-adams"}},[_c('strong',[_v("Michael")]),_v(" D. Adams"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#michael-d-adams","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Co-Lecturer")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("adamsmd")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" COM3‐02‐47"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/adamsmd"}},[_v("@adamsmd")])])])])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Prabhu"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/prabhu-na.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"prabhu-natarajan"}},[_c('strong',[_v("Prabhu")]),_v(" NATARAJAN"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#prabhu-natarajan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Co-Lecturer")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("prabhu")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("comp.nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" COM3-02-34 | "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 6516 1105"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/prabhu-na"}},[_v("@prabhu-na")])])])])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Danny"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/bluesky0911.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"kim-hyeongcheol-danny"}},[_v("Kim hyeongcheol ("),_c('strong',[_v("Danny")]),_v(")"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#kim-hyeongcheol-danny","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Head TA")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dcskh")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 8750 5674"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/bluesky0911"}},[_v("@bluesky0911")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Anis"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/anisyusof-sc.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"anis-bin-yusof"}},[_c('strong',[_v("Anis")]),_v(" Bin Yusof"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#anis-bin-yusof","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Graduate Tutor")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("anis")]),_v("[at]"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("comp.nus.edu.sg")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-phone-square",attrs:{"aria-hidden":"true"}})]),_v(" 6516 8557"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/anisyusof-sc"}},[_v("@anisyusof-sc")])])]),_c('p')])]),_v(" "),_c('h2',{attrs:{"id":"tutors"}},[_v("Tutors"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tutors","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Aditya"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/adityab4.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"1-aditya"}},[_v("1. Aditya"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-aditya","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("BAJAJ ADITYA")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1070584[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/AdityaB4"}},[_v("@AdityaB4")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Ashley"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/ashleyclx.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"2-ashley"}},[_v("2. Ashley"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-ashley","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("ASHLEY CHANG LE XUAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958221[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/ashleyclx"}},[_v("@ashleyclx")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Billy"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/billyhoce.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"3-billy"}},[_v("3. Billy"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-billy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("BILLY HO CHENG EN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958176[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/billyhoce"}},[_v("@billyhoce")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Chan-How"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/chillinrage.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"4-chan-how"}},[_v("4. Chan How"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-chan-how","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("CHONG CHAN HOW")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969803[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/ChillinRage"}},[_v("@ChillinRage")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Dillon"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/dillontkh.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"5-dillon"}},[_v("5. Dillon"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-dillon","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN KAH HO DILLON")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958762[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/dillontkh"}},[_v("@dillontkh")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Dinghao"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/dingbao-sys.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"6-dinghao"}},[_v("6. Dinghao"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#6-dinghao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("SIM DING HAO")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958218[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/DingBao-sys"}},[_v("@DingBao-sys")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Elton"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/notle1706.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"7-elton"}},[_v("7. Elton"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#7-elton","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Chua Meng Yong Elton")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725906[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/notle1706"}},[_v("@notle1706")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Fikri"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/mfjkri.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"8-fikri"}},[_v("8. Fikri"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#8-fikri","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("MUHAMMAD FIKRI BIN ABDUL KALAM")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0970206[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/mfjkri"}},[_v("@mfjkri")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Gallen"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/gongg21.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"9-gallen"}},[_v("9. Gallen"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#9-gallen","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GALLEN ONG KAI BIN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958202[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/gongg21"}},[_v("@gongg21")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Ha-Thu"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/oeggy03.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"10-ha-thu"}},[_v("10. Ha Thu"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#10-ha-thu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TRAN HA THU")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969496[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/oeggy03"}},[_v("@oeggy03")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Hui-Xuan"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/huixuant.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"11-hui-xuan"}},[_v("11. Hui Xuan"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#11-hui-xuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN HUI XUAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0775523[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/huixuant"}},[_v("@huixuant")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Isaac"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/cocoanautz.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"12-isaac"}},[_v("12. Isaac"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#12-isaac","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("ONG KOK YEE ISAAC")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0373113[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/cocoanautz"}},[_v("@cocoanautz")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Jin-Yuan"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/jnjy.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"13-jin-yuan"}},[_v("13. Jin Yuan"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#13-jin-yuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("NG JIN YUAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0775530[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/jnjy"}},[_v("@jnjy")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Jiu-Fong"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/lamjiufong.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"14-jiu-fong"}},[_v("14. Jiu Fong"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#14-jiu-fong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("LAM JIU FONG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0960521[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/LamJiuFong"}},[_v("@LamJiuFong")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Joel"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/joelgoh1.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"15-joel"}},[_v("15. Joel"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#15-joel","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("JOEL GOH MIN FENG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0957940[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/joelgoh1"}},[_v("@joelgoh1")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Jun-Yi"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/junyi00.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"16-jun-yi"}},[_v("16. Jun Yi"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#16-jun-yi","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GOH JUN YI")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0726438[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Junyi00"}},[_v("@Junyi00")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Junwu"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/narwhalsilent.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"17-junwu"}},[_v("17. Junwu"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#17-junwu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("WANG JUNWU")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1032464[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/narwhalsilent"}},[_v("@narwhalsilent")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Khang-Hou"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/tankh99.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"18-khang-hou"}},[_v("18. Khang Hou"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#18-khang-hou","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN KHANG HOU")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1067145[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/tankh99"}},[_v("@tankh99")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Kyal"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/marcus-ny.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"19-kyal"}},[_v("19. Kyal"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#19-kyal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("KYAL SIN MIN THET")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969846[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/marcus-ny"}},[_v("@marcus-ny")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Lynnette"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/lynnetteeee.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"20-lynnette"}},[_v("20. Lynnette"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#20-lynnette","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("ONG XIN HUI LYNNETTE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0968030[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/lynnetteeee"}},[_v("@lynnetteeee")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Marcus"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/hollag.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"21-marcus"}},[_v("21. Marcus"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#21-marcus","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("SOH ZHENG YANG, MARCUS")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0957429[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/HollaG"}},[_v("@HollaG")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Melissa"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/melissaharijanto.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"22-melissa"}},[_v("22. Melissa"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#22-melissa","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Melissa Anastasia Harijanto")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0851434[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/melissaharijanto"}},[_v("@melissaharijanto")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Merrick"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/merrickneo.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"23-merrick"}},[_v("23. Merrick"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#23-merrick","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("MERRICK NEO KAI JIE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0726513[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Merrickneo"}},[_v("@Merrickneo")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Reyaaz"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/arpspoofing.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"24-reyaaz"}},[_v("24. Reyaaz"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#24-reyaaz","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("MUHAMMAD REYAAZ BIN ABDUL BASHEER")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0544058[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/ARPspoofing"}},[_v("@ARPspoofing")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Richie"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/richiehx.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"25-richie"}},[_v("25. Richie"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#25-richie","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("RICHIE HSIEH")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0957714[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/richiehx"}},[_v("@richiehx")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Rithik"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/papataco14.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"26-rithik"}},[_v("26. Rithik"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#26-rithik","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("RAMU RITHIK VIJAY")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969886[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/papataco14"}},[_v("@papataco14")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Shuyao"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/tim-siu.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"27-shuyao"}},[_v("27. Shuyao"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#27-shuyao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("XU SHUYAO")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e1088140[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Tim-Siu"}},[_v("@Tim-Siu")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Si-Kai"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/sikai00.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"28-si-kai"}},[_v("28. Si Kai"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#28-si-kai","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Chang Si Kai")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725915[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/sikai00"}},[_v("@sikai00")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Tania"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/taniatsq.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"29-tania"}},[_v("29. Tania"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#29-tania","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TANIA TAN SHU QI")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969220[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/taniatsq"}},[_v("@taniatsq")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Timothy"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/tim-pipi.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"30-timothy"}},[_v("30. Timothy"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#30-timothy","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TIMOTHY PUTRA PRASETIO")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0960320[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/tim-pipi"}},[_v("@tim-pipi")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Wayne"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/waynezsy.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"31-wayne"}},[_v("31. Wayne"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#31-wayne","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Wayne Zhang Si Yuan")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0726154[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/waynezsy"}},[_v("@waynezsy")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Wei-Zhe"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/wz2k.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"32-wei-zhe"}},[_v("32. Wei Zhe"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#32-wei-zhe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("TAN WEI ZHE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725610[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/wz2k"}},[_v("@wz2k")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Xiao-Yun"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/wxiaoyun.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"33-xiao-yun"}},[_v("33. Xiao Yun"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#33-xiao-yun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("WU XIAOYUN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0702008[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/wxiaoyun"}},[_v("@wxiaoyun")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yan-Jie"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/logical-1985516.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"34-yan-jie"}},[_v("34. Yan Jie"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#34-yan-jie","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("NG YAN JIE")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0969516[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/logical-1985516"}},[_v("@logical-1985516")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yi-Teng"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/puakii.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"35-yi-teng"}},[_v("35. Yi Teng"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#35-yi-teng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Tee Yi Teng")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725799[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Puakii"}},[_v("@Puakii")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yong-Jing"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/gohyongjing.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"36-yong-jing"}},[_v("36. Yong Jing"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#36-yong-jing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GOH YONG JING")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0693145[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/gohyongjing"}},[_v("@gohyongjing")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yu-Cong"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/yucongkoo.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"37-yu-cong"}},[_v("37. Yu Cong"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#37-yu-cong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("KOO YU CONG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0960480[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/yucongkoo"}},[_v("@yucongkoo")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yue-Ran"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/kyueran.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"38-yue-ran"}},[_v("38. Yue Ran"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#38-yue-ran","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("KANG YUE RAN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0695185[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/kyueran"}},[_v("@kyueran")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Yuheng"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/distractedcat.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"39-yuheng"}},[_v("39. Yuheng"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#39-yuheng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("GUO YUHENG")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0958572[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/DistractedCat"}},[_v("@DistractedCat")])])]),_c('p')])]),_v(" "),_c('hr'),_v(" "),_c('div',{staticClass:"container",attrs:{"id":"Zong-Xun"}},[_c('div',{staticClass:"row bt-2"},[_c('div',{staticClass:"col-3"},[_c('img',{staticClass:"mt-1 rounded",attrs:{"src":"https://nus-cs2103-ay2425s1.github.io/tutor-photos/zxun2.png","width":"150","onerror":"this.src='images/placeholder-large.png';"}})]),_v(" "),_c('div',{staticClass:"col"},[_c('h3',{attrs:{"id":"40-zong-xun"}},[_v("40. Zong Xun"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#40-zong-xun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("LEE ZONG XUN")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e0725594[at]u.nus.edu")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('a',{attrs:{"href":"https://github.com/Zxun2"}},[_v("@Zxun2")])])]),_c('p')])]),_v(" "),_c('hr')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/usingThisWebsite.html b/admin/usingThisWebsite.html index d3369a7763..0aa20a83b7 100644 --- a/admin/usingThisWebsite.html +++ b/admin/usingThisWebsite.html @@ -21,7 +21,7 @@
  • Course OverviewCourse Expectations


    Using this Website

    The Weekly Schedule Page is your main source of information for CS2103/T. You will need to refer to it weekly. For an overview of the full schedule, refer to the Full Timeline page.

    More details for the upcoming weeks will be added as the weeks progress. In general, information given for more than 1 week into the future should be treated as tentative.

    Browser compatibility

    Most of this will work on most mainstream Browsers, although some pages might not work well in small-screen devices.

    Information layers

    We try to layer information so that readers have the freedom to omit less important layers if they wish to. Some 'layering' techniques used are explained below:

    More important information are in bold or highlighted while less important information are dimmed or in collapsed panels such as the below.

    Some less important info in a boarder-less panel


    Some less important info in a panel


    You can use the button in a panel to open it as a new tab (it can be expanded in-place too). This feature is available only for panels containing another full page of the website (i.e., not available if the panel contains an extract of a page). e.g.,

    A panel that can be opened as another tab


    Tabs indicate alternative content (e.g. video vs text). You can choose the one you like and ignore the other tabs.

    Some textual description of X


    Video describing X


    Dotted underlines indicate (activated by hovering over it) and dashed underlines indicate modal windows (activated by clicking) containing additional information.

    the topic levels system indicates the progression of contents from basic/relevant topics to advanced/less-relevant topics. Open the panel below to see more details of that system.

    Conventions used

    Shorthand headings

    Meaning of some shortened headings:

    • What : the meaning of the concept in concern (example)
    • Why : the motivation behind the concept in concern (example)
    • How : the usage of the concept in concern (example)
    • When : the pros and cons of the concept in concern, when to use the concept (example)

    Meaning of icons

    : additional info
    : warning
    : positive message
    or : important message
    : error or danger to avoid
    or : tip
    : definition or topic
    extra : tangential info, can be ignored if not interested
    : learning outcomes
    : examples
    : resources
    : exercises
    : printable version
    : preview/more info
    : video
    >_ : a command to be run in a terminal
    : textual description
    : slides
    : output produced by running code
    question without answer
    question with answer

    : tasks to do
    : lecture/briefing
    : tutorial
    : deadline

    Searching for keywords

    Use the search box in the top navigation bar to search for keywords in the website pages. If you cannot find the content related to a keyword, let us know by posting in the forum so that we can add the missing keyword to our search index.

    Saving as PDF files

    Follow this guide @SE-EDU/guides.

    Printing Textbook Content

    A PDF version of the full textbook () will be provided at the start of the semester.

    In addition, printer-friendly version (indicated by icon) have been provided for each chapter and the whole book. You can use them for saving as pdf files or printing.

    Making this Website Better

    This website was generated using the MarkBind software developed at NUS. We welcome bug reports, suggestions, and contributions, to be submitted in the forum.


    Course OverviewCourse Expectations

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Course OverviewCourse Expectations


    Using this Website

    The Weekly Schedule Page is your main source of information for CS2103/T. You will need to refer to it weekly. For an overview of the full schedule, refer to the Full Timeline page.

    More details for the upcoming weeks will be added as the weeks progress. In general, information given for more than 1 week into the future should be treated as tentative.

    Browser compatibility

    Most of this will work on most mainstream Browsers, although some pages might not work well in small-screen devices.

    Information layers

    We try to layer information so that readers have the freedom to omit less important layers if they wish to. Some 'layering' techniques used are explained below:

    More important information are in bold or highlighted while less important information are dimmed or in collapsed panels such as the below.

    Some less important info in a boarder-less panel


    Some less important info in a panel


    You can use the button in a panel to open it as a new tab (it can be expanded in-place too). This feature is available only for panels containing another full page of the website (i.e., not available if the panel contains an extract of a page). e.g.,

    A panel that can be opened as another tab


    Tabs indicate alternative content (e.g. video vs text). You can choose the one you like and ignore the other tabs.

    Some textual description of X


    Video describing X


    Dotted underlines indicate (activated by hovering over it) and dashed underlines indicate modal windows (activated by clicking) containing additional information.

    the topic levels system indicates the progression of contents from basic/relevant topics to advanced/less-relevant topics. Open the panel below to see more details of that system.

    Conventions used

    Shorthand headings

    Meaning of some shortened headings:

    • What : the meaning of the concept in concern (example)
    • Why : the motivation behind the concept in concern (example)
    • How : the usage of the concept in concern (example)
    • When : the pros and cons of the concept in concern, when to use the concept (example)

    Meaning of icons

    : additional info
    : warning
    : positive message
    or : important message
    : error or danger to avoid
    or : tip
    : definition or topic
    extra : tangential info, can be ignored if not interested
    : learning outcomes
    : examples
    : resources
    : exercises
    : printable version
    : preview/more info
    : video
    >_ : a command to be run in a terminal
    : textual description
    : slides
    : output produced by running code
    question without answer
    question with answer

    : tasks to do
    : lecture/briefing
    : tutorial
    : deadline

    Searching for keywords

    Use the search box in the top navigation bar to search for keywords in the website pages. If you cannot find the content related to a keyword, let us know by posting in the forum so that we can add the missing keyword to our search index.

    Saving as PDF files

    Follow this guide @SE-EDU/guides.

    Printing Textbook Content

    A PDF version of the full textbook () will be provided at the start of the semester.

    In addition, printer-friendly version (indicated by icon) have been provided for each chapter and the whole book. You can use them for saving as pdf files or printing.

    Making this Website Better

    This website was generated using the MarkBind software developed at NUS. We welcome bug reports, suggestions, and contributions, to be submitted in the forum.


    Course OverviewCourse Expectations

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/usingThisWebsite.page-vue-render.js b/admin/usingThisWebsite.page-vue-render.js index 3001c67e4a..26549251a3 100644 --- a/admin/usingThisWebsite.page-vue-render.js +++ b/admin/usingThisWebsite.page-vue-render.js @@ -143,6 +143,6 @@ with(this){return _c('p',[_v("This website was generated using the "),_c('a',{at with(this){return _c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/courseOverview.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Course Overview")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/courseExpectations.html"}},[_c('span',[_v("Course Expectations "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/admin/weeklySchedule.html b/admin/weeklySchedule.html index 4756e55058..ed3904f83e 100644 --- a/admin/weeklySchedule.html +++ b/admin/weeklySchedule.html @@ -21,7 +21,7 @@
  • Course Briefing VideosWeekly Briefings


    Weekly Schedule

    Timing of the weekly briefing

    As our lecture slot (which we use for the weekly briefing) is on Friday (i.e., at the end of the week), the briefing in Weekn lecture slot covers a recap of Weekn and a preview of Weekn+1 e.g. The briefing on week 3 Friday covers a recap of week 3 and a preview of week 4.

    Deadline for weekly tasks

    The deadline for weekly tasks is Friday 1600 i.e.,the lecture slot start time. Work done after that time (e.g., code committed after Friday 1600) will be credited for the following week.

    It's OK to miss a few weekly project deadlines occasionally i.e., we'll not penalize you even if you occasionally miss those deadlines, as long as you catch up soon enough (within a few days after the deadline). This flexibility does not apply if a task description states a specific deadline.

    It's OK to make occasional mistakes in weekly tasks (making mistakes is a natural part of learning new things after all). If a weekly task was not accepted as 'done' due to a mistake you made, go ahead and rectify the mistake as soon as you can -- our grading scripts will not penalize such mistakes if they are corrected soon after.

    We won't wait forever though. Note that for most interim deliverables, we stop checking about one week after the deadline is over. So, work/corrections done more than one week after the deadline might not get noticed at all by our grading scripts, even as late submissions.

    Timing recommendations

    • Start Weekn+1 tasks on Weekn Friday. As the Weekn+1 briefing is done on Weekn Friday (i.e., ~2 days before the week actually starts), you are recommended to start on Weekn tasks on that Friday itself. That way, you have more time to finish them by the Weekn+1 deadline (i.e., Weekn+1 Friday 1600).
    • Before attempting weekly project tasks, go through the weekly topics as the knowledge from those topics may be needed to complete the project tasks.
    • Try to finish most weekly tasks before attending the tutorial of that week, because some tutorial tasks are done best after weekly tasks have been completed, for the best learning experience.

    Course Briefing VideosWeekly Briefings

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Course Briefing VideosWeekly Briefings


    Weekly Schedule

    Timing of the weekly briefing

    As our lecture slot (which we use for the weekly briefing) is on Friday (i.e., at the end of the week), the briefing in Weekn lecture slot covers a recap of Weekn and a preview of Weekn+1 e.g. The briefing on week 3 Friday covers a recap of week 3 and a preview of week 4.

    Deadline for weekly tasks

    The deadline for weekly tasks is Friday 1600 i.e.,the lecture slot start time. Work done after that time (e.g., code committed after Friday 1600) will be credited for the following week.

    It's OK to miss a few weekly project deadlines occasionally i.e., we'll not penalize you even if you occasionally miss those deadlines, as long as you catch up soon enough (within a few days after the deadline). This flexibility does not apply if a task description states a specific deadline.

    It's OK to make occasional mistakes in weekly tasks (making mistakes is a natural part of learning new things after all). If a weekly task was not accepted as 'done' due to a mistake you made, go ahead and rectify the mistake as soon as you can -- our grading scripts will not penalize such mistakes if they are corrected soon after.

    We won't wait forever though. Note that for most interim deliverables, we stop checking about one week after the deadline is over. So, work/corrections done more than one week after the deadline might not get noticed at all by our grading scripts, even as late submissions.

    Timing recommendations

    • Start Weekn+1 tasks on Weekn Friday. As the Weekn+1 briefing is done on Weekn Friday (i.e., ~2 days before the week actually starts), you are recommended to start on Weekn tasks on that Friday itself. That way, you have more time to finish them by the Weekn+1 deadline (i.e., Weekn+1 Friday 1600).
    • Before attempting weekly project tasks, go through the weekly topics as the knowledge from those topics may be needed to complete the project tasks.
    • Try to finish most weekly tasks before attending the tutorial of that week, because some tutorial tasks are done best after weekly tasks have been completed, for the best learning experience.

    Course Briefing VideosWeekly Briefings

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/admin/weeklySchedule.page-vue-render.js b/admin/weeklySchedule.page-vue-render.js index 87e502ee39..1952f8a545 100644 --- a/admin/weeklySchedule.page-vue-render.js +++ b/admin/weeklySchedule.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Course Briefing Videos")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/lectures.html"}},[_c('span',[_v("Weekly Briefings "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('br'),_v(" "),_c('h1',{attrs:{"id":"weekly-schedule"}},[_c('span',{staticClass:"display-4"},[_v("Weekly Schedule")]),_v(" "),_c('span',{staticClass:"text-muted text-light",staticStyle:{"font-size":"15px"}},[_c('span',{staticClass:"badge rounded-pill bg-light text-primary"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#weekly-schedule","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',{attrs:{"tags":"m--cs2103","id":"week-definition"}},[_c('h3',{attrs:{"id":"timing-of-the-weekly-briefing"}},[_v("Timing of the weekly briefing"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#timing-of-the-weekly-briefing","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("As our lecture slot (which we use for the weekly briefing) is on Friday (i.e., at the end of the week), "),_c('mark',[_v("the briefing in Week"),_c('sub',[_v("n")]),_v(" lecture slot covers a recap of Week"),_c('sub',[_v("n")]),_v(" and a preview of Week"),_c('sub',[_v("n+1")])]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. The briefing on week 3 Friday covers a recap of week 3 and a preview of week 4")]),_v(".")])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"deadline-definition"}},[_c('h3',{attrs:{"id":"deadline-for-weekly-tasks"}},[_v("Deadline for weekly tasks"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#deadline-for-weekly-tasks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_c('strong',[_v("The deadline")]),_v(" for weekly tasks is Friday 1600")]),_v(" i.e.,the lecture slot start time. Work done after that time "),_c('span',{staticClass:"dimmed"},[_v("(e.g., code committed after Friday 1600)")]),_v(" will be credited for the following week.")]),_v(" "),_c('p',[_c('strong',[_v("It's OK to miss a few weekly project deadlines occasionally")]),_v(" i.e., we'll not penalize you even if you occasionally miss those deadlines, as long as you catch up soon enough (within a few days after the deadline). This flexibility does not apply if a task description states a specific deadline."),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("It's OK to make occasional mistakes in weekly tasks")]),_v(" (making mistakes is a natural part of learning new things after all). If a weekly task was not accepted as 'done' due to a mistake you made, go ahead and rectify the mistake as soon as you can -- our grading scripts will not penalize such mistakes if they are corrected soon after.")]),_v(" "),_c('p',[_c('strong',[_v("We won't wait forever though.")]),_v(" Note that for most interim deliverables, we stop checking about one week after the deadline is over. So, work/corrections done more than one week after the deadline might not get noticed at all by our grading scripts, even as late submissions.")])]),_v(" "),_c('h3',{attrs:{"id":"timing-recommendations"}},[_v("Timing recommendations"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#timing-recommendations","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-square-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Start Week"),_c('sub',[_v("n+1")]),_v(" tasks on Week"),_c('sub',[_v("n")]),_v(" Friday")]),_v(". As the Week"),_c('sub',[_v("n+1")]),_v(" briefing is done on Week"),_c('sub',[_v("n")]),_v(" Friday (i.e., ~2 days before the week actually starts), you are recommended to start on Week"),_c('sub',[_v("n")]),_v(" tasks on that Friday itself. That way, you have more time to finish them by the Week"),_c('sub',[_v("n+1")]),_v(" deadline (i.e., Week"),_c('sub',[_v("n+1")]),_v(" Friday 1600).")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-square-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('span',{attrs:{"id":"before-attempting-tasks"}},[_c('strong',[_v("Before attempting weekly project tasks, go through the weekly topics")]),_v(" as the knowledge from those topics may be needed to complete the project tasks.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-square-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Try to finish most weekly tasks before attending the tutorial of that week")]),_v(", because some tutorial tasks are done best "),_c('em',[_v("after")]),_v(" weekly tasks have been completed, for the best learning experience.")])])])]),_v(" "),_c('br'),_v(" "),_c('p',[_c('span',{staticClass:"float-start algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/courseBriefings.html"}},[_c('span',[_c('span',{staticClass:"far fa-arrow-alt-circle-left",attrs:{"aria-hidden":"true"}}),_v(" Course Briefing Videos")])])]),_c('span',{staticClass:"float-end algolia-no-index"},[_c('a',{staticClass:"badge bg-light text-dark",attrs:{"href":"/website/admin/lectures.html"}},[_c('span',[_v("Weekly Briefings "),_c('span',{staticClass:"far fa-arrow-alt-circle-right",attrs:{"aria-hidden":"true"}})])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/about/acknowledgements.html b/book/about/acknowledgements.html index 83271237b8..7f15d8c7cf 100644 --- a/book/about/acknowledgements.html +++ b/book/about/acknowledgements.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    This book is SE-EDU sub project.

    License

    • This book is free and open-source, and is available under the MIT licence.

    Bug reports, suggestions

    Contributions

    • PRs are welcome.

    Contact us

    • You can contact us as seer[at]comp.nus.edu.sg.

    Acknowledgements

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    This book is SE-EDU sub project.

    License

    • This book is free and open-source, and is available under the MIT licence.

    Bug reports, suggestions

    Contributions

    • PRs are welcome.

    Contact us

    • You can contact us as seer[at]comp.nus.edu.sg.

    Acknowledgements

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/about/acknowledgements.page-vue-render.js b/book/about/acknowledgements.page-vue-render.js index 705f828f55..40d7412ed2 100644 --- a/book/about/acknowledgements.page-vue-render.js +++ b/book/about/acknowledgements.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('div',{attrs:{"id":"body"}},[_c('p',[_c('strong',[_v("This book is "),_c('a',{attrs:{"href":"https://se-education.org"}},[_v("SE-EDU")]),_v(" sub project.")])]),_v(" "),_c('h2',{attrs:{"id":"license"}},[_v("License"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#license","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("This book is free and open-source, and is available under the MIT licence.")])]),_v(" "),_c('h2',{attrs:{"id":"bug-reports-suggestions"}},[_v("Bug reports, suggestions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#bug-reports-suggestions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Please post in "),_c('a',{attrs:{"href":"https://github.com/se-edu/se-book/issues"}},[_v("issue tracker")]),_v(".")])]),_v(" "),_c('h2',{attrs:{"id":"contributions"}},[_v("Contributions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#contributions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("PRs are welcome.")])]),_v(" "),_c('h2',{attrs:{"id":"contact-us"}},[_v("Contact us"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#contact-us","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("You can contact us as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("seer[at]comp.nus.edu.sg")]),_v(".")])]),_v(" "),_c('h2',{attrs:{"id":"acknowledgements"}},[_v("Acknowledgements"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#acknowledgements","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"text-only"}},[_c('ul',[_c('li',[_c('p',[_v("A large portion of this book is based on learning materials created by the following Software Engineering Instructors for their students (in alphabetical order):")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~bimlesh"}},[_v("Bimlesh Wadhwa")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~damithch"}},[_v("Damith C. Rajapakse")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~hchia"}},[_v("Henry Chia")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.comp.nus.edu.sg/~sooyj"}},[_v("Soo Yuen Jien")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"https://github.com/rebekahlow-jy"}},[_v("Rebekah Low")]),_v(": For programming the initial version of this book in "),_c('a',{attrs:{"href":"https://markbind.github.io/"}},[_v("MarkBind")]),_v(" format.")])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/clientServer/index.html b/book/architecture/architecturalStyles/clientServer/index.html index b19e5ef23a..66c9c48730 100644 --- a/book/architecture/architecturalStyles/clientServer/index.html +++ b/book/architecture/architecturalStyles/clientServer/index.html @@ -13,7 +13,7 @@ +

    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/clientServer/index.page-vue-render.js b/book/architecture/architecturalStyles/clientServer/index.page-vue-render.js index b402a057a4..1deba86e66 100644 --- a/book/architecture/architecturalStyles/clientServer/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/clientServer/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"client-server-architectural-style"}},[_c('span',[_v("Client-server architectural style")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#client-server-architectural-style","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/clientServer/what/index.html b/book/architecture/architecturalStyles/clientServer/what/index.html index cf977f7bf6..002ee827dd 100644 --- a/book/architecture/architecturalStyles/clientServer/what/index.html +++ b/book/architecture/architecturalStyles/clientServer/what/index.html @@ -13,7 +13,7 @@ +

    What

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/clientServer/what/index.page-vue-render.js b/book/architecture/architecturalStyles/clientServer/what/index.page-vue-render.js index 2de7060aee..68a0387b64 100644 --- a/book/architecture/architecturalStyles/clientServer/what/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/clientServer/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("The "),_c('em',[_v("client-server")]),_v(" style has at least one component playing the role of a server and at least one client component accessing the services of the server.")]),_v(" This is an architectural style used often in distributed applications.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/eventDriven/index.html b/book/architecture/architecturalStyles/eventDriven/index.html index ea69978413..87fbad381c 100644 --- a/book/architecture/architecturalStyles/eventDriven/index.html +++ b/book/architecture/architecturalStyles/eventDriven/index.html @@ -13,7 +13,7 @@

    Design → Architecture → Styles → -

    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/eventDriven/index.page-vue-render.js b/book/architecture/architecturalStyles/eventDriven/index.page-vue-render.js index b1de983a87..bbdc53396c 100644 --- a/book/architecture/architecturalStyles/eventDriven/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/eventDriven/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"event-driven-architectural-style"}},[_c('span',[_v("Event-driven architectural style")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#event-driven-architectural-style","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/eventDriven/what/index.html b/book/architecture/architecturalStyles/eventDriven/what/index.html index 2d1b1209d7..b5de2c3916 100644 --- a/book/architecture/architecturalStyles/eventDriven/what/index.html +++ b/book/architecture/architecturalStyles/eventDriven/what/index.html @@ -13,7 +13,7 @@

    Can identify event-driven architectural style

    Design → Architecture → Styles → Event-Driven Style → -

    What

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/eventDriven/what/index.page-vue-render.js b/book/architecture/architecturalStyles/eventDriven/what/index.page-vue-render.js index 7423df6f95..478c05a300 100644 --- a/book/architecture/architecturalStyles/eventDriven/what/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/eventDriven/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/index.html b/book/architecture/architecturalStyles/index.html index 5b3e859839..b474170195 100644 --- a/book/architecture/architecturalStyles/index.html +++ b/book/architecture/architecturalStyles/index.html @@ -13,7 +13,7 @@

    Design → Architecture → -

    Architectural styles

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...



    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.



    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.



    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.



    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:


    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.



    More

    More styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Architectural styles

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...



    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.



    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.



    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.



    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:


    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.



    More

    More styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/index.page-vue-render.js b/book/architecture/architecturalStyles/index.page-vue-render.js index acc0d95bab..185b2bcd0f 100644 --- a/book/architecture/architecturalStyles/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"architectural-styles"}},[_c('span',[_v("Architectural styles")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#architectural-styles","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/introduction/index.html b/book/architecture/architecturalStyles/introduction/index.html index f15634598c..bf64b59353 100644 --- a/book/architecture/architecturalStyles/introduction/index.html +++ b/book/architecture/architecturalStyles/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/introduction/index.page-vue-render.js b/book/architecture/architecturalStyles/introduction/index.page-vue-render.js index 2769b5940d..c4e4d2fe1c 100644 --- a/book/architecture/architecturalStyles/introduction/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/introduction/what/index.html b/book/architecture/architecturalStyles/introduction/what/index.html index 8c90659269..778c241d7f 100644 --- a/book/architecture/architecturalStyles/introduction/what/index.html +++ b/book/architecture/architecturalStyles/introduction/what/index.html @@ -13,7 +13,7 @@ +

    What

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/introduction/what/index.page-vue-render.js b/book/architecture/architecturalStyles/introduction/what/index.page-vue-render.js index b4c1533331..7f61ecbec3 100644 --- a/book/architecture/architecturalStyles/introduction/what/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/introduction/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('strong',[_v("Software architectures follow various high-level styles (aka "),_c('em',[_v("architectural patterns")]),_v(")")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/more/index.html b/book/architecture/architecturalStyles/more/index.html index 58963ee94b..3abd2dfd18 100644 --- a/book/architecture/architecturalStyles/more/index.html +++ b/book/architecture/architecturalStyles/more/index.html @@ -13,7 +13,7 @@

    Design → Architecture → Styles → -

    More

    More styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    More

    More styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/more/index.page-vue-render.js b/book/architecture/architecturalStyles/more/index.page-vue-render.js index 690b7c65e6..845211cee4 100644 --- a/book/architecture/architecturalStyles/more/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/more/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"more"}},[_c('span',[_v("More")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/more/moreStyles/index.html b/book/architecture/architecturalStyles/more/moreStyles/index.html index a914efba85..a526389e6a 100644 --- a/book/architecture/architecturalStyles/more/moreStyles/index.html +++ b/book/architecture/architecturalStyles/more/moreStyles/index.html @@ -13,7 +13,7 @@

    Can name several other architecture styles

    Design → Architecture → Styles → -

    More styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    More styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/more/moreStyles/index.page-vue-render.js b/book/architecture/architecturalStyles/more/moreStyles/index.page-vue-render.js index 4c2170791b..ac244a7db4 100644 --- a/book/architecture/architecturalStyles/more/moreStyles/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/more/moreStyles/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can name several other architecture styles")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Design → Architecture → Styles →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"more-styles"}},[_c('span',[_v("More styles")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more-styles","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Other well-known architectural styles include the "),_c('em',[_v("pipes-and-filters architecture")]),_v(", the "),_c('em',[_v("broker architecture")]),_v(", the "),_c('em',[_v("peer-to-peer architecture")]),_v(", and the "),_c('em',[_v("message-oriented architecture")]),_v(".")])])]),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"https://docs.microsoft.com/en-us/azure/architecture/patterns/pipes-and-filters"}},[_c('strong',[_v("Pipes and Filters pattern")])]),_v(" -- an article from Microsoft about the pipes and filters architectural style")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Broker_pattern"}},[_c('strong',[_v("Broker pattern")])]),_v(" -- Wikipedia article on the broker architectural style")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Peer-to-peer"}},[_c('strong',[_v("Peer-to-peer pattern")])]),_v(" -- Wikipedia article on the P2P architectural style")])])])])])])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/more/usingStyles/index.html b/book/architecture/architecturalStyles/more/usingStyles/index.html index c382b9b08f..ecea69ffdf 100644 --- a/book/architecture/architecturalStyles/more/usingStyles/index.html +++ b/book/architecture/architecturalStyles/more/usingStyles/index.html @@ -13,7 +13,7 @@ +

    Using styles

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/more/usingStyles/index.page-vue-render.js b/book/architecture/architecturalStyles/more/usingStyles/index.page-vue-render.js index 198d90f426..d8368d36c5 100644 --- a/book/architecture/architecturalStyles/more/usingStyles/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/more/usingStyles/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Most applications use a mix of these with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/nTier/index.html b/book/architecture/architecturalStyles/nTier/index.html index 205b394140..b56b3c9fff 100644 --- a/book/architecture/architecturalStyles/nTier/index.html +++ b/book/architecture/architecturalStyles/nTier/index.html @@ -13,7 +13,7 @@ +

    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/nTier/index.page-vue-render.js b/book/architecture/architecturalStyles/nTier/index.page-vue-render.js index c10a142383..f08a5a7f5c 100644 --- a/book/architecture/architecturalStyles/nTier/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/nTier/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"n-tier-architectural-style"}},[_c('span',[_v("N-tier architectural style")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#n-tier-architectural-style","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/nTier/what/index.html b/book/architecture/architecturalStyles/nTier/what/index.html index 0a3abf351d..5b11555fd3 100644 --- a/book/architecture/architecturalStyles/nTier/what/index.html +++ b/book/architecture/architecturalStyles/nTier/what/index.html @@ -13,7 +13,7 @@ +

    What

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/nTier/what/index.page-vue-render.js b/book/architecture/architecturalStyles/nTier/what/index.page-vue-render.js index 71f8890d79..21eec83be9 100644 --- a/book/architecture/architecturalStyles/nTier/what/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/nTier/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("In the "),_c('em',[_v("n-tier")]),_v(" style, higher layers make use of services provided by lower layers.")]),_v(" Lower layers are independent of higher layers. Other names: "),_c('em',[_v("multi-layered")]),_v(", "),_c('em',[_v("layered")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/serviceOriented/index.html b/book/architecture/architecturalStyles/serviceOriented/index.html index 2e277f9c70..cd37856e86 100644 --- a/book/architecture/architecturalStyles/serviceOriented/index.html +++ b/book/architecture/architecturalStyles/serviceOriented/index.html @@ -13,7 +13,7 @@

    Design → Architecture → Styles → -

    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/serviceOriented/index.page-vue-render.js b/book/architecture/architecturalStyles/serviceOriented/index.page-vue-render.js index e096a13185..3dd5109f2f 100644 --- a/book/architecture/architecturalStyles/serviceOriented/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/serviceOriented/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"service-oriented-architectural-style"}},[_c('span',[_v("Service-oriented architectural style")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#service-oriented-architectural-style","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/serviceOriented/what/index.html b/book/architecture/architecturalStyles/serviceOriented/what/index.html index afb9149d57..347f3cccff 100644 --- a/book/architecture/architecturalStyles/serviceOriented/what/index.html +++ b/book/architecture/architecturalStyles/serviceOriented/what/index.html @@ -13,7 +13,7 @@

    Can identify service-oriented architectural style

    Design → Architecture → Styles → Service-Oriented Style → -

    What

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/serviceOriented/what/index.page-vue-render.js b/book/architecture/architecturalStyles/serviceOriented/what/index.page-vue-render.js index 417fa7ad44..75c0a3b4d9 100644 --- a/book/architecture/architecturalStyles/serviceOriented/what/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/serviceOriented/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("The "),_c('em',[_v("service-oriented with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.devteam.space/blog/microservices-vs-soa-comparison/"}},[_c('strong',[_v("Microservices vs SOA Comparison")])]),_v(" -- an article by Jamie Maguire")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/transactionProcessing/index.html b/book/architecture/architecturalStyles/transactionProcessing/index.html index d790aa94a6..e7018cc320 100644 --- a/book/architecture/architecturalStyles/transactionProcessing/index.html +++ b/book/architecture/architecturalStyles/transactionProcessing/index.html @@ -13,7 +13,7 @@

    Design → Architecture → Styles → -

    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/transactionProcessing/index.page-vue-render.js b/book/architecture/architecturalStyles/transactionProcessing/index.page-vue-render.js index 3dd69fcb34..5e93ccb3a4 100644 --- a/book/architecture/architecturalStyles/transactionProcessing/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/transactionProcessing/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"transaction-processing-architectural-style"}},[_c('span',[_v("Transaction processing architectural style")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#transaction-processing-architectural-style","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architecturalStyles/transactionProcessing/what/index.html b/book/architecture/architecturalStyles/transactionProcessing/what/index.html index 8a5bb2e3f2..1b5f846358 100644 --- a/book/architecture/architecturalStyles/transactionProcessing/what/index.html +++ b/book/architecture/architecturalStyles/transactionProcessing/what/index.html @@ -13,7 +13,7 @@

    Can identify transaction processing architectural style

    Design → Architecture → Styles → Transaction Processing Style → -

    What

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architecturalStyles/transactionProcessing/what/index.page-vue-render.js b/book/architecture/architecturalStyles/transactionProcessing/what/index.page-vue-render.js index 9e7046fa01..b556b603dc 100644 --- a/book/architecture/architecturalStyles/transactionProcessing/what/index.page-vue-render.js +++ b/book/architecture/architecturalStyles/transactionProcessing/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("The "),_c('em',[_v("transaction processing")]),_v(" style divides the workload of the system down to a number of "),_c('em',[_v("transactions")]),_v(" which are then given to a "),_c('em',[_v("dispatcher")]),_v(" that controls the execution of each transaction.")]),_v(" Task queuing, ordering, undo etc. are handled by the dispatcher.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architectureDiagrams/drawing/index.html b/book/architecture/architectureDiagrams/drawing/index.html index 34504584c5..fe02201216 100644 --- a/book/architecture/architectureDiagrams/drawing/index.html +++ b/book/architecture/architectureDiagrams/drawing/index.html @@ -13,7 +13,7 @@

    Can draw an architecture diagram

    Design → Architecture → Architecture Diagrams → -

    Drawing

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Drawing

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architectureDiagrams/drawing/index.page-vue-render.js b/book/architecture/architectureDiagrams/drawing/index.page-vue-render.js index 9dd5b0452a..dbecbef98c 100644 --- a/book/architecture/architectureDiagrams/drawing/index.page-vue-render.js +++ b/book/architecture/architectureDiagrams/drawing/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"drawing"}},[_c('span',[_v("Dra with(this){return _c('ul',[_c('li',[_c('p',[_v("Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings "),_c('span',{staticClass:"dimmed"},[_v("e.g. A drum symbol is widely-understood as representing a database")]),_v(", explain their meaning.")])]),_v(" "),_c('li',[_c('p',[_v("Avoid the indiscriminate use of double-headed arrows to show interactions between components.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architectureDiagrams/index.html b/book/architecture/architectureDiagrams/index.html index 330344647e..1f9dd4f1d1 100644 --- a/book/architecture/architectureDiagrams/index.html +++ b/book/architecture/architectureDiagrams/index.html @@ -13,7 +13,7 @@

    Design → Architecture → -

    Architecture diagrams

    Reading

    Can interpret an architecture diagram

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:


    Drawing

    Can draw an architecture diagram

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Architecture diagrams

    Reading

    Can interpret an architecture diagram

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:


    Drawing

    Can draw an architecture diagram

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architectureDiagrams/index.page-vue-render.js b/book/architecture/architectureDiagrams/index.page-vue-render.js index fed553fbdb..1e5df53d15 100644 --- a/book/architecture/architectureDiagrams/index.page-vue-render.js +++ b/book/architecture/architectureDiagrams/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"architecture-diagrams"}},[_c('span',[_v("Architecture diagrams")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#architecture-diagrams","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/architectureDiagrams/reading/index.html b/book/architecture/architectureDiagrams/reading/index.html index 75fd75a58c..58694beb1e 100644 --- a/book/architecture/architectureDiagrams/reading/index.html +++ b/book/architecture/architectureDiagrams/reading/index.html @@ -13,7 +13,7 @@ +

    Reading

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/architectureDiagrams/reading/index.page-vue-render.js b/book/architecture/architectureDiagrams/reading/index.page-vue-render.js index f060c85fd9..e385ff2352 100644 --- a/book/architecture/architectureDiagrams/reading/index.page-vue-render.js +++ b/book/architecture/architectureDiagrams/reading/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"reading"}},[_c('span',[_v("Rea with(this){return _c('p',[_c('strong',[_v("Architecture diagrams are free-form diagrams.")]),_v(" There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/index.html b/book/architecture/index.html index 2dec35d254..b9f1aba58d 100644 --- a/book/architecture/index.html +++ b/book/architecture/index.html @@ -13,7 +13,7 @@

    Software architecture

    Introduction

    What

    Can explain Software Architecture

    The software architecture of a program or computing system is the structure or structures of the system, which comprise software elements, the externally visible properties of those elements, and the relationships among them. Architecture is concerned with the public side of interfaces; private details of elements—details having to do solely with internal implementation—are not architectural. --- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture




    Architecture diagrams

    Reading

    Can interpret an architecture diagram

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:


    Drawing

    Can draw an architecture diagram

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.



    Architectural styles

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...



    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.



    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.



    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.



    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:


    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.



    More

    More styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.





    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +-- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture




    Architecture diagrams

    Reading

    Can interpret an architecture diagram

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:


    Drawing

    Can draw an architecture diagram

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.



    Architectural styles

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...



    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.



    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.



    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.



    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:


    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.



    More

    More styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.





    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/index.page-vue-render.js b/book/architecture/index.page-vue-render.js index 18f6c7f8be..939704a216 100644 --- a/book/architecture/index.page-vue-render.js +++ b/book/architecture/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"software-architecture"}},[_c('span',[_v("Software architecture")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-architecture","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/introduction/index.html b/book/architecture/introduction/index.html index e22e952de0..1b28e796d3 100644 --- a/book/architecture/introduction/index.html +++ b/book/architecture/introduction/index.html @@ -14,7 +14,7 @@

    Design → Architecture →

    Introduction

    What

    Can explain Software Architecture

    The software architecture of a program or computing system is the structure or structures of the system, which comprise software elements, the externally visible properties of those elements, and the relationships among them. Architecture is concerned with the public side of interfaces; private details of elements—details having to do solely with internal implementation—are not architectural. --- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +-- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/introduction/index.page-vue-render.js b/book/architecture/introduction/index.page-vue-render.js index 4c9cfd1d24..e96de85560 100644 --- a/book/architecture/introduction/index.page-vue-render.js +++ b/book/architecture/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/architecture/introduction/what/index.html b/book/architecture/introduction/what/index.html index 92a4e89500..5ed72ee6e8 100644 --- a/book/architecture/introduction/what/index.html +++ b/book/architecture/introduction/what/index.html @@ -14,7 +14,7 @@

    Can explain Software Architecture

    Design → Architecture → Introduction →

    What

    The software architecture of a program or computing system is the structure or structures of the system, which comprise software elements, the externally visible properties of those elements, and the relationships among them. Architecture is concerned with the public side of interfaces; private details of elements—details having to do solely with internal implementation—are not architectural. --- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +-- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/architecture/introduction/what/index.page-vue-render.js b/book/architecture/introduction/what/index.page-vue-render.js index b148af188e..7452186035 100644 --- a/book/architecture/introduction/what/index.page-vue-render.js +++ b/book/architecture/introduction/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("The architecture is typically designe with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.html b/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.html index 66d57380cd..92619d1b64 100644 --- a/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.html +++ b/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.html @@ -13,7 +13,7 @@ +

    Avoid empty catch blocks

    Avoid empty catch statements, as they are a way to ignore errors silently (which is not a good thing). In cases when it is unavoidable, at least give a comment to explain why the catch block is left empty.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.page-vue-render.js index 6a3f9ff9c5..e84d058c31 100644 --- a/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/basic/avoidEmptyCatchBlocks/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: avoid empty catch blocks ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Error-Prone Practices → Basic →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"avoid-empty-catch-blocks"}},[_c('span',[_v("Avoid empty catch blocks")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#avoid-empty-catch-blocks","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Avoid empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v(" statements")]),_v(", as they are a way to ignore errors silently (which is not a good thing). In cases when it is unavoidable, at least give a comment to explain why the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v(" block is left empty.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.html b/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.html index f2d5b64c0d..0b29c7b501 100644 --- a/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.html +++ b/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: delete dead code

    Implementation → Code Quality → Error-Prone Practices → Basic → -

    Delete dead code

    Get rid of unused code the moment it becomes redundant. You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore ("I spent a lot of time writing that code; what if I need it again?"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Delete dead code

    Get rid of unused code the moment it becomes redundant. You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore ("I spent a lot of time writing that code; what if I need it again?"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.page-vue-render.js index b422105f15..334514664d 100644 --- a/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/basic/deleteDeadCode/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: delete dead code ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Error-Prone Practices → Basic →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"delete-dead-code"}},[_c('span',[_v("Delete dead code")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#delete-dead-code","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Get rid of unused code the moment it becomes redundant.")]),_v(" You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore (\"I spent a lot of time writing that code; what if I need it again?\"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.html b/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.html index 6a165ee7f5..ebce75404f 100644 --- a/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.html +++ b/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.html @@ -169,7 +169,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.page-vue-render.js index 8889970b37..dbcd726717 100644 --- a/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/basic/dontRecycleVarsOrParams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"don-t-recycle-variables-or-par with(this){return _c('ul',[_c('li',[_c('strong',[_v("Use one variable for one purpose.")]),_v(" Do not reuse a variable for a different purpose other than its intended one, just because the data type is the same.")]),_v(" "),_c('li',[_c('strong',[_v("Do not "),_c('em',[_v("reuse")]),_v(" formal parameters as local variables")]),_v(" inside the method.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/basic/index.html b/book/codeQuality/avoidShortcuts/basic/index.html index 9a704ba1cd..2c56e996f8 100644 --- a/book/codeQuality/avoidShortcuts/basic/index.html +++ b/book/codeQuality/avoidShortcuts/basic/index.html @@ -244,7 +244,7 @@ -

    Avoid empty catch blocks

    Can improve code quality using technique: avoid empty catch blocks

    Avoid empty catch statements, as they are a way to ignore errors silently (which is not a good thing). In cases when it is unavoidable, at least give a comment to explain why the catch block is left empty.


    Delete dead code

    Can improve code quality using technique: delete dead code

    Get rid of unused code the moment it becomes redundant. You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore ("I spent a lot of time writing that code; what if I need it again?"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Avoid empty catch blocks

    Can improve code quality using technique: avoid empty catch blocks

    Avoid empty catch statements, as they are a way to ignore errors silently (which is not a good thing). In cases when it is unavoidable, at least give a comment to explain why the catch block is left empty.


    Delete dead code

    Can improve code quality using technique: delete dead code

    Get rid of unused code the moment it becomes redundant. You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore ("I spent a lot of time writing that code; what if I need it again?"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/basic/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/basic/index.page-vue-render.js index 56aa298817..577ccc2aa6 100644 --- a/book/codeQuality/avoidShortcuts/basic/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/basic/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"basic"}},[_c('span',[_v("Basic")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#basic","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.html b/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.html index 522111b247..109cbebd21 100644 --- a/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.html +++ b/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.html @@ -88,7 +88,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.page-vue-render.js index 02bf82a3d1..e42e2d090a 100644 --- a/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/basic/useDefaultBranch/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Always include a default branch in ") with(this){return _c('p',[_c('strong',[_v("Furthermore, use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("default")]),_v(" branch for the intended default action and not just to execute the last option.")]),_v(" If there is no default action, you can use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("default")]),_v(" branch to detect errors (i.e. if execution reached the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("default")]),_v(" branch, raise a suitable error). This also applies to the final "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("else")]),_v(" of an "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("if-else")]),_v(" construct. That is, the final "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("else")]),_v(" should mean 'everything else', and not the final option. Do not use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("else")]),_v(" when an "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("if")]),_v(" condition can be explicitly specified, unless there is absolutely no other possibility.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/index.html b/book/codeQuality/avoidShortcuts/index.html index cb08a7aff0..a88a07b1ee 100644 --- a/book/codeQuality/avoidShortcuts/index.html +++ b/book/codeQuality/avoidShortcuts/index.html @@ -244,7 +244,7 @@ -

    Avoid empty catch blocks

    Can improve code quality using technique: avoid empty catch blocks

    Avoid empty catch statements, as they are a way to ignore errors silently (which is not a good thing). In cases when it is unavoidable, at least give a comment to explain why the catch block is left empty.


    Delete dead code

    Can improve code quality using technique: delete dead code

    Get rid of unused code the moment it becomes redundant. You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore ("I spent a lot of time writing that code; what if I need it again?"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.



    Intermediate

    Minimize scope of variables

    Can improve code quality using technique: minimize scope of variables

    Minimize global variables. Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.

    Define variables in the least possible scope. For example, if the variable is used only within the if block of the conditional statement, it should be declared inside that if block.

    The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used. -- Effective Java, by Joshua Bloch


    Minimize code duplication

    Can improve code quality using technique: minimize code duplication

    Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation. While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.

    This guideline is closely related to the DRY Principle.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Avoid empty catch blocks

    Can improve code quality using technique: avoid empty catch blocks

    Avoid empty catch statements, as they are a way to ignore errors silently (which is not a good thing). In cases when it is unavoidable, at least give a comment to explain why the catch block is left empty.


    Delete dead code

    Can improve code quality using technique: delete dead code

    Get rid of unused code the moment it becomes redundant. You might feel reluctant to delete code you have painstakingly written, even if you have no use for that code anymore ("I spent a lot of time writing that code; what if I need it again?"). Consider all code as baggage you have to carry. If you need that code again, simply recover it from the revision control tool you are using. Deleting code you wrote previously is a sign that you are improving.



    Intermediate

    Minimize scope of variables

    Can improve code quality using technique: minimize scope of variables

    Minimize global variables. Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.

    Define variables in the least possible scope. For example, if the variable is used only within the if block of the conditional statement, it should be declared inside that if block.

    The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used. -- Effective Java, by Joshua Bloch


    Minimize code duplication

    Can improve code quality using technique: minimize code duplication

    Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation. While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.

    This guideline is closely related to the DRY Principle.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/index.page-vue-render.js index 3f8f03db45..0817d416fa 100644 --- a/book/codeQuality/avoidShortcuts/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-avoid-unsafe-shortcuts"}},[_c('span',[_v("Guideline: Avoid unsafe shortcuts")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-avoid-unsafe-shortcuts","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/intermediate/index.html b/book/codeQuality/avoidShortcuts/intermediate/index.html index b04ab733fa..fb991ef2cc 100644 --- a/book/codeQuality/avoidShortcuts/intermediate/index.html +++ b/book/codeQuality/avoidShortcuts/intermediate/index.html @@ -13,7 +13,7 @@

    Implementation → Code Quality → Error-Prone Practices → -

    Intermediate

    Minimize scope of variables

    Can improve code quality using technique: minimize scope of variables

    Minimize global variables. Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.

    Define variables in the least possible scope. For example, if the variable is used only within the if block of the conditional statement, it should be declared inside that if block.

    The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used. -- Effective Java, by Joshua Bloch


    Minimize code duplication

    Can improve code quality using technique: minimize code duplication

    Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation. While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.

    This guideline is closely related to the DRY Principle.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Intermediate

    Minimize scope of variables

    Can improve code quality using technique: minimize scope of variables

    Minimize global variables. Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.

    Define variables in the least possible scope. For example, if the variable is used only within the if block of the conditional statement, it should be declared inside that if block.

    The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used. -- Effective Java, by Joshua Bloch


    Minimize code duplication

    Can improve code quality using technique: minimize code duplication

    Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation. While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.

    This guideline is closely related to the DRY Principle.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/intermediate/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/intermediate/index.page-vue-render.js index b2dc86f599..d556f6ec0c 100644 --- a/book/codeQuality/avoidShortcuts/intermediate/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/intermediate/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"intermediate"}},[_c('span',[_v("Intermediate")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intermediate","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.html b/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.html index b8c5346bf4..bfef79d3e1 100644 --- a/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.html +++ b/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: minimize code duplication

    Implementation → Code Quality → Error-Prone Practices → Intermediate → -

    Minimize code duplication

    Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation. While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.

    This guideline is closely related to the DRY Principle.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Minimize code duplication

    Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation. While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.

    This guideline is closely related to the DRY Principle.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.page-vue-render.js index 1d4700fb5f..78699c3aa0 100644 --- a/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/intermediate/minimiseCodeDuplication/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"minimize-code-duplication"}},[ with(this){return _c('p',[_c('strong',[_v("Code duplication, especially when you copy-paste-modify code, often indicates a poor quality implementation.")]),_v(" While it may not be possible to have zero duplication, always think twice before duplicating code; most often there is a better alternative.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.html b/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.html index 88a1ff5e5b..63e27bcca2 100644 --- a/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.html +++ b/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: minimize scope of variables

    Implementation → Code Quality → Error-Prone Practices → Intermediate → -

    Minimize scope of variables

    Minimize global variables. Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.

    Define variables in the least possible scope. For example, if the variable is used only within the if block of the conditional statement, it should be declared inside that if block.

    The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used. -- Effective Java, by Joshua Bloch

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Minimize scope of variables

    Minimize global variables. Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.

    Define variables in the least possible scope. For example, if the variable is used only within the if block of the conditional statement, it should be declared inside that if block.

    The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used. -- Effective Java, by Joshua Bloch

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.page-vue-render.js index 6b09a63c4e..1fe4b9c257 100644 --- a/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/intermediate/minimiseVariableScope/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: minimize scope of variables ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Error-Prone Practices → Intermediate →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"minimize-scope-of-variables"}},[_c('span',[_v("Minimize scope of variables")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#minimize-scope-of-variables","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Minimize global variables")]),_v(". Global variables may be the most convenient way to pass information around, but they do create implicit links between code segments that use the global variable. Avoid them as much as possible.")]),_v(" "),_c('p',[_c('strong',[_v("Define variables in the least possible scope")]),_v(". For example, if the variable is used only within the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("if")]),_v(" block of the conditional statement, it should be declared inside that "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("if")]),_v(" block.")]),_v(" "),_c('blockquote',[_c('p',[_c('strong',[_v("The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used.")]),_v(" "),_c('sub',[_v("-- "),_c('em',[_v("Effective Java")]),_v(", by Joshua Bloch")])])])]),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/reduceScopeOfVariable.html"}},[_v("Refactoring: Reduce Scope of Variable")])])])])])])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/avoidShortcuts/introduction/index.html b/book/codeQuality/avoidShortcuts/introduction/index.html index 75efa6b041..0a4a6c9a88 100644 --- a/book/codeQuality/avoidShortcuts/introduction/index.html +++ b/book/codeQuality/avoidShortcuts/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    It is safer to use language constructs in the way they are meant to be used, even if the language allows shortcuts. Such coding practices are common sources of bugs. Know them and avoid them.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/avoidShortcuts/introduction/index.page-vue-render.js b/book/codeQuality/avoidShortcuts/introduction/index.page-vue-render.js index f2442ae8aa..6aecd4100d 100644 --- a/book/codeQuality/avoidShortcuts/introduction/index.page-vue-render.js +++ b/book/codeQuality/avoidShortcuts/introduction/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain the need for avoiding error-prone shortcuts")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Error-Prone Practices →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("It is safer to use language constructs in the way they are meant to be used")]),_v(", even if the language allows shortcuts. Such coding practices are common sources of bugs. Know them and avoid them.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.html b/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.html index 0a0d4e1c88..81c98d5ee1 100644 --- a/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.html +++ b/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.html @@ -93,7 +93,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.page-vue-render.js b/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.page-vue-render.js index 94a2da58af..b01512755e 100644 --- a/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/basic/dontRepeatObvious/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"do-not-repeat-the-obvious"}},[ with(this){return _c('p',[_c('strong',[_v("Do not repeat in comments information that is already obvious from the code.")]),_v(" If the code is self-explanatory, a comment may not be needed.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/basic/index.html b/book/codeQuality/commentMinimally/basic/index.html index 208bdf57e6..20d0dbffc4 100644 --- a/book/codeQuality/commentMinimally/basic/index.html +++ b/book/codeQuality/commentMinimally/basic/index.html @@ -247,7 +247,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/basic/index.page-vue-render.js b/book/codeQuality/commentMinimally/basic/index.page-vue-render.js index 1e49e5094e..9c53d06dcf 100644 --- a/book/codeQuality/commentMinimally/basic/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/basic/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"basic"}},[_c('span',[_v("Basic")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#basic","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/basic/writeToReader/index.html b/book/codeQuality/commentMinimally/basic/writeToReader/index.html index ce2e25d82d..83f6f20106 100644 --- a/book/codeQuality/commentMinimally/basic/writeToReader/index.html +++ b/book/codeQuality/commentMinimally/basic/writeToReader/index.html @@ -167,7 +167,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/basic/writeToReader/index.page-vue-render.js b/book/codeQuality/commentMinimally/basic/writeToReader/index.page-vue-render.js index 7a5a14dbd7..b0b41320d9 100644 --- a/book/codeQuality/commentMinimally/basic/writeToReader/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/basic/writeToReader/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"write-to-the-reader"}},[_c('sp with(this){return _c('p',[_c('strong',[_v("Write comments targeting other programmers reading the code.")]),_v(" Do not write comments as if they are private notes to yourself. Instead, One type of comment that is almost always useful is the "),_c('em',[_v("header comment")]),_v(" that you write for a class or an operation to explain its purpose.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/index.html b/book/codeQuality/commentMinimally/index.html index 5d42849d88..6ca02ac335 100644 --- a/book/codeQuality/commentMinimally/index.html +++ b/book/codeQuality/commentMinimally/index.html @@ -398,7 +398,7 @@ -


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/index.page-vue-render.js b/book/codeQuality/commentMinimally/index.page-vue-render.js index ca10426a85..37fa21ef0a 100644 --- a/book/codeQuality/commentMinimally/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-comment-minimally-but-sufficiently"}},[_c('span',[_v("Guideline: Comment minimally, but sufficiently")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-comment-minimally-but-sufficiently","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.html b/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.html index 1ec1911ff1..b7e7a26f15 100644 --- a/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.html +++ b/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.html @@ -164,7 +164,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.page-vue-render.js b/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.page-vue-render.js index 3bec9be0cc..89d8495ce3 100644 --- a/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/intermediate/explainWhatWhyNotHow/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[ with(this){return _c('p',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-times",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("HOW: The explanation for how the code works.")]),_v(" This should already be apparent from the code, if the code is self-explanatory. Adding comments to explain the same thing is redundant.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/intermediate/index.html b/book/codeQuality/commentMinimally/intermediate/index.html index df1e0da1f5..01b19a2aa9 100644 --- a/book/codeQuality/commentMinimally/intermediate/index.html +++ b/book/codeQuality/commentMinimally/intermediate/index.html @@ -164,7 +164,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/intermediate/index.page-vue-render.js b/book/codeQuality/commentMinimally/intermediate/index.page-vue-render.js index 2a679c9fd2..add7e43274 100644 --- a/book/codeQuality/commentMinimally/intermediate/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/intermediate/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"intermediate"}},[_c('span',[_v("Intermediate")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intermediate","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/commentMinimally/introduction/index.html b/book/codeQuality/commentMinimally/introduction/index.html index 0a2f50a7e7..50803d930a 100644 --- a/book/codeQuality/commentMinimally/introduction/index.html +++ b/book/codeQuality/commentMinimally/introduction/index.html @@ -13,7 +13,7 @@

    Can explain the need for commenting minimally but sufficiently

    Implementation → Code Quality → Comments → -

    Introduction

    Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’ Improve the code and then document it to make it even clearer. -- Steve McConnell, Author of Clean Code

    Some think commenting heavily increases the 'code quality'. That is not so. Avoid writing comments to explain bad code. Improve the code to make it self-explanatory.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’ Improve the code and then document it to make it even clearer. -- Steve McConnell, Author of Clean Code

    Some think commenting heavily increases the 'code quality'. That is not so. Avoid writing comments to explain bad code. Improve the code to make it self-explanatory.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/commentMinimally/introduction/index.page-vue-render.js b/book/codeQuality/commentMinimally/introduction/index.page-vue-render.js index 197b37dcf6..578271fe51 100644 --- a/book/codeQuality/commentMinimally/introduction/index.page-vue-render.js +++ b/book/codeQuality/commentMinimally/introduction/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain the need for commenting minimally but sufficiently")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Comments →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('blockquote',[_c('p',[_v("Good code is its own best documentation. As you’re about to add a comment, ask yourself, ‘How can I improve the code so that this comment isn’t needed?’ Improve the code and then document it to make it even clearer. "),_c('sub',[_v("-- "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Steve_McConnell"}},[_v("Steve McConnell")]),_v(", Author of "),_c('em',[_v("Clean Code")])])])]),_v(" "),_c('p',[_v("Some think commenting heavily increases the 'code quality'. That is not so. Avoid writing comments to explain bad code. Improve the code to make it self-explanatory.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/followStandard/basic/index.html b/book/codeQuality/followStandard/basic/index.html index d11079e477..56c32d30ee 100644 --- a/book/codeQuality/followStandard/basic/index.html +++ b/book/codeQuality/followStandard/basic/index.html @@ -13,7 +13,7 @@ +

    What

    Go through the Java coding standard at @SE-EDU and learn the basic style rules.


    Exercises:

    Find basic coding standard violations


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/followStandard/basic/index.page-vue-render.js b/book/codeQuality/followStandard/basic/index.page-vue-render.js index 5c235f8f1a..bffe2d3412 100644 --- a/book/codeQuality/followStandard/basic/index.page-vue-render.js +++ b/book/codeQuality/followStandard/basic/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('div',{staticClass:"alt-java"},[_c('p',[_v("Go th with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/followStandard/index.html b/book/codeQuality/followStandard/index.html index b517896611..49c12db0d9 100644 --- a/book/codeQuality/followStandard/index.html +++ b/book/codeQuality/followStandard/index.html @@ -13,7 +13,7 @@

    Implementation → Code Quality → -

    Guideline: Follow a standard

    Introduction

    Can explain the need for following a standard

    One essential way to improve code quality is to follow a consistent style. That is why software engineers usually follow a strict coding standard (aka style guide).

    The aim of a coding standard is to make the entire codebase look like it was written by one person. A coding standard is usually specific to a programming language and specifies guidelines such as the locations of opening and closing braces, indentation styles and naming styles (e.g. whether to use Hungarian style, Pascal casing, Camel casing, etc.). It is important that the whole team/company uses the same coding standard and that the standard is generally not inconsistent with typical industry practices. If a company's coding standard is very different from what is typically used in the industry, new recruits will take longer to get used to the company's coding style.

    IDEs can help to enforce some parts of a coding standard e.g. indentation rules.


    Exercises:

    What is the recommended approach regarding coding standards?



    What

    Can follow simple mechanical style rules

    Go through the Java coding standard at @SE-EDU and learn the basic style rules.


    Exercises:

    Find basic coding standard violations



    Intermediate

    Can follow intermediate style rules

    Go through the Java coding standard at @SE-EDU and learn the intermediate style rules.


    Exercises:

    Unsuitable variable name


    Find intermediate coding standard violations



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Guideline: Follow a standard

    Introduction

    Can explain the need for following a standard

    One essential way to improve code quality is to follow a consistent style. That is why software engineers usually follow a strict coding standard (aka style guide).

    The aim of a coding standard is to make the entire codebase look like it was written by one person. A coding standard is usually specific to a programming language and specifies guidelines such as the locations of opening and closing braces, indentation styles and naming styles (e.g. whether to use Hungarian style, Pascal casing, Camel casing, etc.). It is important that the whole team/company uses the same coding standard and that the standard is generally not inconsistent with typical industry practices. If a company's coding standard is very different from what is typically used in the industry, new recruits will take longer to get used to the company's coding style.

    IDEs can help to enforce some parts of a coding standard e.g. indentation rules.


    Exercises:

    What is the recommended approach regarding coding standards?



    What

    Can follow simple mechanical style rules

    Go through the Java coding standard at @SE-EDU and learn the basic style rules.


    Exercises:

    Find basic coding standard violations



    Intermediate

    Can follow intermediate style rules

    Go through the Java coding standard at @SE-EDU and learn the intermediate style rules.


    Exercises:

    Unsuitable variable name


    Find intermediate coding standard violations



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/followStandard/index.page-vue-render.js b/book/codeQuality/followStandard/index.page-vue-render.js index f120c6b035..6b3ee7ebf8 100644 --- a/book/codeQuality/followStandard/index.page-vue-render.js +++ b/book/codeQuality/followStandard/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-follow-a-standard"}},[_c('span',[_v("Guideline: Follow a standard")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-follow-a-standard","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/followStandard/intermediate/index.html b/book/codeQuality/followStandard/intermediate/index.html index 59f327f93b..7418a14768 100644 --- a/book/codeQuality/followStandard/intermediate/index.html +++ b/book/codeQuality/followStandard/intermediate/index.html @@ -13,7 +13,7 @@ +

    Intermediate

    Go through the Java coding standard at @SE-EDU and learn the intermediate style rules.


    Exercises:

    Unsuitable variable name


    Find intermediate coding standard violations


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/followStandard/intermediate/index.page-vue-render.js b/book/codeQuality/followStandard/intermediate/index.page-vue-render.js index 3b6ae7a1a5..02a5de203d 100644 --- a/book/codeQuality/followStandard/intermediate/index.page-vue-render.js +++ b/book/codeQuality/followStandard/intermediate/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("Go through the "),_c('a',{attrs:{"href": with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/followStandard/introduction/index.html b/book/codeQuality/followStandard/introduction/index.html index 7aba4557d6..41dc1ea8ab 100644 --- a/book/codeQuality/followStandard/introduction/index.html +++ b/book/codeQuality/followStandard/introduction/index.html @@ -13,7 +13,7 @@

    Can explain the need for following a standard

    Implementation → Code Quality → Style → -

    Introduction

    One essential way to improve code quality is to follow a consistent style. That is why software engineers usually follow a strict coding standard (aka style guide).

    The aim of a coding standard is to make the entire codebase look like it was written by one person. A coding standard is usually specific to a programming language and specifies guidelines such as the locations of opening and closing braces, indentation styles and naming styles (e.g. whether to use Hungarian style, Pascal casing, Camel casing, etc.). It is important that the whole team/company uses the same coding standard and that the standard is generally not inconsistent with typical industry practices. If a company's coding standard is very different from what is typically used in the industry, new recruits will take longer to get used to the company's coding style.

    IDEs can help to enforce some parts of a coding standard e.g. indentation rules.


    Exercises:

    What is the recommended approach regarding coding standards?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    One essential way to improve code quality is to follow a consistent style. That is why software engineers usually follow a strict coding standard (aka style guide).

    The aim of a coding standard is to make the entire codebase look like it was written by one person. A coding standard is usually specific to a programming language and specifies guidelines such as the locations of opening and closing braces, indentation styles and naming styles (e.g. whether to use Hungarian style, Pascal casing, Camel casing, etc.). It is important that the whole team/company uses the same coding standard and that the standard is generally not inconsistent with typical industry practices. If a company's coding standard is very different from what is typically used in the industry, new recruits will take longer to get used to the company's coding style.

    IDEs can help to enforce some parts of a coding standard e.g. indentation rules.


    Exercises:

    What is the recommended approach regarding coding standards?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/followStandard/introduction/index.page-vue-render.js b/book/codeQuality/followStandard/introduction/index.page-vue-render.js index f59e6fdc71..a27740963e 100644 --- a/book/codeQuality/followStandard/introduction/index.page-vue-render.js +++ b/book/codeQuality/followStandard/introduction/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("The aim of a coding standard is to ma with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/index.html b/book/codeQuality/index.html index 4ade3ecf34..31162a49cd 100644 --- a/book/codeQuality/index.html +++ b/book/codeQuality/index.html @@ -1755,7 +1755,7 @@ -



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/index.page-vue-render.js b/book/codeQuality/index.page-vue-render.js index a28a570387..20b6bfcecb 100644 --- a/book/codeQuality/index.page-vue-render.js +++ b/book/codeQuality/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"code-quality"}},[_c('span',[_v("Code quality")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#code-quality","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/introduction/basic/index.html b/book/codeQuality/introduction/basic/index.html index 57dfe6fced..6c294128bb 100644 --- a/book/codeQuality/introduction/basic/index.html +++ b/book/codeQuality/introduction/basic/index.html @@ -13,7 +13,7 @@ +

    What

    Always code as if the person who ends up maintaining your code will be a violent psychopath who knows where you live. -- Martin Golding

    Production code needs to be of high quality. Given how the world is becoming increasingly dependent on software, poor quality code is something no one can afford to tolerate.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/introduction/basic/index.page-vue-render.js b/book/codeQuality/introduction/basic/index.page-vue-render.js index 5c8b215fef..601835337c 100644 --- a/book/codeQuality/introduction/basic/index.page-vue-render.js +++ b/book/codeQuality/introduction/basic/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" Always code as if the person who ends up maintaining your code will be a violent psychopath who knows where you live. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("-- Martin Golding")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/introduction/index.html b/book/codeQuality/introduction/index.html index ce187eccf0..bc30f7ad71 100644 --- a/book/codeQuality/introduction/index.html +++ b/book/codeQuality/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    What

    Can explain the importance of code quality

    Always code as if the person who ends up maintaining your code will be a violent psychopath who knows where you live. -- Martin Golding

    Production code needs to be of high quality. Given how the world is becoming increasingly dependent on software, poor quality code is something no one can afford to tolerate.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/introduction/index.page-vue-render.js b/book/codeQuality/introduction/index.page-vue-render.js index d05c0717d2..fc2f7df485 100644 --- a/book/codeQuality/introduction/index.page-vue-render.js +++ b/book/codeQuality/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/advanced/index.html b/book/codeQuality/maximizeReadability/advanced/index.html index aec932de1e..b1af5c6c14 100644 --- a/book/codeQuality/maximizeReadability/advanced/index.html +++ b/book/codeQuality/maximizeReadability/advanced/index.html @@ -194,7 +194,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/advanced/index.page-vue-render.js b/book/codeQuality/maximizeReadability/advanced/index.page-vue-render.js index cf42a2204c..ad01a1a2d4 100644 --- a/book/codeQuality/maximizeReadability/advanced/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/advanced/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"advanced"}},[_c('span',[_v("Advanced")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#advanced","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.html b/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.html index 991ef4134d..f9d36438e9 100644 --- a/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.html +++ b/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.html @@ -194,7 +194,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.page-vue-render.js b/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.page-vue-render.js index 51fb008fe6..231d3e5fda 100644 --- a/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/advanced/makeHappyPathProminent/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"make-the-happy-path-prominent" with(this){return _c('p',[_c('strong',[_v("The "),_c('em',[_v("happy path")]),_v(" should be clear and prominent in your code.")]),_v(" Restructure the code to make the happy path (i.e. the execution path taken when everything goes well) less-nested as much as possible. It is the ‘unusual’ cases that should be nested. Someone reading the code should not get distracted by alternative paths taken when error conditions happen. One technique that could help in this regard is the use of "),_c('a',{attrs:{"href":"http://wiki.c2.com/?GuardClause"}},[_v("guard clauses")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.html b/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.html index 5ccf8f1b68..0257647fe9 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.html +++ b/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.html @@ -170,7 +170,7 @@ -

    The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague. -- Edsger Dijkstra

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague. -- Edsger Dijkstra

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.page-vue-render.js b/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.page-vue-render.js index dc687f6157..c990043819 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/basic/avoidComplicatedExpressions/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Avoid complicated expressions, especi with(this){return _c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" The competent programmer is fully aware of the strictly limited size of his own skull; therefore he approaches the programming task in full humility, and among other things he avoids clever tricks like the plague. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("-- Edsger Dijkstra")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.html b/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.html index 6e1063465d..18b49293aa 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.html +++ b/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.html @@ -204,7 +204,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.page-vue-render.js b/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.page-vue-render.js index 314fc27250..de1e1f9aad 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/basic/avoidDeepNesting/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Avoid deep nesting")]),_v(" -- the de with(this){return _c('p',[_c('strong',[_v("In particular, avoid "),_c('a',{attrs:{"href":"https://blog.codinghorror.com/flattening-arrow-code/"}},[_c('em',[_v("arrowhead")]),_v(" style code")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.html b/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.html index a750380a1a..9bda9ede83 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.html +++ b/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.html @@ -13,7 +13,7 @@ +

    Avoid long methods

    Avoid long methods as they often contain more information than what the reader can process at a time. Consider if shortening is possible when a method goes beyond 30 . The bigger the haystack, the harder it is to find a needle.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.page-vue-render.js b/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.page-vue-render.js index 74e5b5289b..3ac81a840c 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/basic/avoidLongMethods/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"avoid-long-methods"}},[_c('span',[_v("Avoid long methods")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#avoid-long-methods","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.html b/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.html index 155621419e..b644e231e4 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.html +++ b/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.html @@ -243,7 +243,7 @@ -

    Avoid any magic literals in general, not just magic numbers.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Avoid any magic literals in general, not just magic numbers.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.page-vue-render.js b/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.page-vue-render.js index c75f66d3d8..b2400336aa 100644 --- a/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/basic/avoidMagicNumbers/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('strong',[_v("Avoid "),_c('em',[_v("magic numbers")])])} with(this){return _c('p',[_c('strong',[_v("Avoid any "),_c('em',[_v("magic literals")])]),_v(" in general, not just magic numbers.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/basic/index.html b/book/codeQuality/maximizeReadability/basic/index.html index 2f2a646130..d3f2ad497b 100644 --- a/book/codeQuality/maximizeReadability/basic/index.html +++ b/book/codeQuality/maximizeReadability/basic/index.html @@ -591,7 +591,7 @@ -

    Avoid any magic literals in general, not just magic numbers.


    Make the code obvious

    Can improve code quality using technique: make the code obvious

    Make the code as explicit as possible, even if the language syntax allows them to be implicit. Here are some examples:

    • [Java] Use explicit type conversion instead of implicit type conversion.
    • [Java, Python] Use parentheses/braces to show groupings even when they can be skipped.
    • [Java, Python] Use enumerations when a certain variable can take only a small number of finite values. For example, instead of declaring the variable 'state' as an integer and using values 0, 1, 2 to denote the states 'starting', 'enabled', and 'disabled' respectively, declare 'state' as type SystemState and define an enumeration SystemState that has values 'STARTING', 'ENABLED', and 'DISABLED'.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Avoid any magic literals in general, not just magic numbers.


    Make the code obvious

    Can improve code quality using technique: make the code obvious

    Make the code as explicit as possible, even if the language syntax allows them to be implicit. Here are some examples:

    • [Java] Use explicit type conversion instead of implicit type conversion.
    • [Java, Python] Use parentheses/braces to show groupings even when they can be skipped.
    • [Java, Python] Use enumerations when a certain variable can take only a small number of finite values. For example, instead of declaring the variable 'state' as an integer and using values 0, 1, 2 to denote the states 'starting', 'enabled', and 'disabled' respectively, declare 'state' as type SystemState and define an enumeration SystemState that has values 'STARTING', 'ENABLED', and 'DISABLED'.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/basic/index.page-vue-render.js b/book/codeQuality/maximizeReadability/basic/index.page-vue-render.js index 1deb212aa5..85b201b79f 100644 --- a/book/codeQuality/maximizeReadability/basic/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/basic/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"basic"}},[_c('span',[_v("Basic")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#basic","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.html b/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.html index 8bbb781cfa..538efe7396 100644 --- a/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.html +++ b/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: make the code obvious

    Implementation → Code Quality → Readability → Basic → -

    Make the code obvious

    Make the code as explicit as possible, even if the language syntax allows them to be implicit. Here are some examples:

    • [Java] Use explicit type conversion instead of implicit type conversion.
    • [Java, Python] Use parentheses/braces to show groupings even when they can be skipped.
    • [Java, Python] Use enumerations when a certain variable can take only a small number of finite values. For example, instead of declaring the variable 'state' as an integer and using values 0, 1, 2 to denote the states 'starting', 'enabled', and 'disabled' respectively, declare 'state' as type SystemState and define an enumeration SystemState that has values 'STARTING', 'ENABLED', and 'DISABLED'.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Make the code obvious

    Make the code as explicit as possible, even if the language syntax allows them to be implicit. Here are some examples:

    • [Java] Use explicit type conversion instead of implicit type conversion.
    • [Java, Python] Use parentheses/braces to show groupings even when they can be skipped.
    • [Java, Python] Use enumerations when a certain variable can take only a small number of finite values. For example, instead of declaring the variable 'state' as an integer and using values 0, 1, 2 to denote the states 'starting', 'enabled', and 'disabled' respectively, declare 'state' as type SystemState and define an enumeration SystemState that has values 'STARTING', 'ENABLED', and 'DISABLED'.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.page-vue-render.js b/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.page-vue-render.js index f3acab1d21..076316073d 100644 --- a/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/basic/makeCodeObvious/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('li',[_v("["),_c('code',{pre:true,attrs:{"class":"line-numb with(this){return _c('li',[_v("["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Java")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Python")]),_v("] Use parentheses/braces to show groupings even when they can be skipped.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/index.html b/book/codeQuality/maximizeReadability/index.html index a807ca1557..29a290e09d 100644 --- a/book/codeQuality/maximizeReadability/index.html +++ b/book/codeQuality/maximizeReadability/index.html @@ -1066,7 +1066,7 @@ -


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/index.page-vue-render.js b/book/codeQuality/maximizeReadability/index.page-vue-render.js index 6cd1a52cb9..830f06ec55 100644 --- a/book/codeQuality/maximizeReadability/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-maximize-readability"}},[_c('span',[_v("Guideline: Maximize readability")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-maximize-readability","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.html b/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.html index 2599e1b393..3ae96cecc0 100644 --- a/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.html +++ b/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: avoid premature optimizations

    Implementation → Code Quality → Readability → Intermediate → -

    Avoid premature optimizations

    Optimizing code prematurely has several drawbacks:

    • You may not know which parts are the real performance bottlenecks. This is especially the case when the code undergoes transformations (e.g. compiling, minifying, transpiling, etc.) before it becomes an executable. Ideally, you should use a profiler tool to identify the actual bottlenecks of the code first, and optimize only those parts.
    • Optimizing can complicate the code, affecting correctness and readability.
    • Hand-optimized code can be harder for the compiler to optimize (the simpler the code, the easier it is for the compiler to optimize). In many cases, a compiler can do a better job of optimizing the runtime code if you don't get in the way by trying to hand-optimize the source code.

    Make it work, make it right, make it fast is popular saying in the industry, which means in most cases, getting the code to perform correctly should take priority over optimizing it. If the code doesn't work correctly, it has no value no matter how fast/efficient it is.

    Premature optimization is the root of all evil in programming. -- Donald Knuth

    Of course, there are cases in which optimizing takes priority over other things e.g. when writing code for resource-constrained environments. This guideline is simply a caution that you should optimize only when it is really needed.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Avoid premature optimizations

    Optimizing code prematurely has several drawbacks:

    • You may not know which parts are the real performance bottlenecks. This is especially the case when the code undergoes transformations (e.g. compiling, minifying, transpiling, etc.) before it becomes an executable. Ideally, you should use a profiler tool to identify the actual bottlenecks of the code first, and optimize only those parts.
    • Optimizing can complicate the code, affecting correctness and readability.
    • Hand-optimized code can be harder for the compiler to optimize (the simpler the code, the easier it is for the compiler to optimize). In many cases, a compiler can do a better job of optimizing the runtime code if you don't get in the way by trying to hand-optimize the source code.

    Make it work, make it right, make it fast is popular saying in the industry, which means in most cases, getting the code to perform correctly should take priority over optimizing it. If the code doesn't work correctly, it has no value no matter how fast/efficient it is.

    Premature optimization is the root of all evil in programming. -- Donald Knuth

    Of course, there are cases in which optimizing takes priority over other things e.g. when writing code for resource-constrained environments. This guideline is simply a caution that you should optimize only when it is really needed.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.page-vue-render.js b/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.page-vue-render.js index f4e005a1e5..b4f3fd43b2 100644 --- a/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/intermediate/avoidPrematureOptimizations/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: avoid premature optimizations ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Readability → Intermediate →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"avoid-premature-optimizations"}},[_c('span',[_v("Avoid premature optimizations")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#avoid-premature-optimizations","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Optimizing code prematurely has several drawbacks")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("You may not know which parts are the real performance bottlenecks")]),_v(". This is especially the case when the code undergoes transformations (e.g. compiling, minifying, transpiling, etc.) before it becomes an executable. Ideally, you should use a profiler tool to identify the actual bottlenecks of the code first, and optimize only those parts.")]),_v(" "),_c('li',[_c('strong',[_v("Optimizing can complicate the code")]),_v(", affecting correctness and readability.")]),_v(" "),_c('li',[_c('strong',[_v("Hand-optimized code can be harder for the compiler to optimize")]),_v(" (the simpler the code, the easier it is for the compiler to optimize). In many cases, a compiler can do a better job of optimizing the runtime code if you don't get in the way by trying to hand-optimize the source code.")])]),_v(" "),_c('p',[_c('strong',[_c('em',[_v("Make it work, make it right, make it fast")])]),_v(" is popular saying in the industry, which means in most cases, getting the code to perform correctly should take priority over optimizing it. If the code doesn't work correctly, it has no value no matter how fast/efficient it is.")]),_v(" "),_c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" Premature optimization is the root of all evil in programming. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("-- "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Donald_Knuth"}},[_v("Donald Knuth")])])])]),_v(" "),_c('p',[_c('strong',[_v("Of course, there are cases in which optimizing takes priority over other things")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. when writing code for resource-constrained environments")]),_v(". This guideline is simply a caution that you should optimize only when it is really needed.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.html b/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.html index a019855660..45b7fcbcd5 100644 --- a/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.html +++ b/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: do not 'trip up' reader

    Implementation → Code Quality → Readability → Intermediate → -

    Do not 'Trip Up' reader

    Avoid things that would make the reader go ‘huh?’, such as,

    • unused parameters in the method signature
    • similar things that look different
    • different things that look similar
    • multiple statements in the same line
    • data flow anomalies such as, pre-assigning values to variables and modifying it without any use of the pre-assigned value
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Do not 'Trip Up' reader

    Avoid things that would make the reader go ‘huh?’, such as,

    • unused parameters in the method signature
    • similar things that look different
    • different things that look similar
    • multiple statements in the same line
    • data flow anomalies such as, pre-assigning values to variables and modifying it without any use of the pre-assigned value
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.page-vue-render.js b/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.page-vue-render.js index 7521644532..a9b716c253 100644 --- a/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/intermediate/dontTripReader/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: do not 'trip up' reader ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Readability → Intermediate →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"do-not-trip-up-reader"}},[_c('span',[_v("Do not 'Trip Up' reader")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#do-not-trip-up-reader","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Avoid things that would make the reader go ‘huh?’")]),_v(", such as,")]),_v(" "),_c('ul',[_c('li',[_v("unused parameters in the method signature")]),_v(" "),_c('li',[_v("similar things that look different")]),_v(" "),_c('li',[_v("different things that look similar")]),_v(" "),_c('li',[_v("multiple statements in the same line")]),_v(" "),_c('li',[_v("data flow anomalies such as, pre-assigning values to variables and modifying it without any use of the pre-assigned value")])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/intermediate/index.html b/book/codeQuality/maximizeReadability/intermediate/index.html index 5350390c7e..8186421dac 100644 --- a/book/codeQuality/maximizeReadability/intermediate/index.html +++ b/book/codeQuality/maximizeReadability/intermediate/index.html @@ -307,7 +307,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/intermediate/index.page-vue-render.js b/book/codeQuality/maximizeReadability/intermediate/index.page-vue-render.js index 170e923f65..3e788d871b 100644 --- a/book/codeQuality/maximizeReadability/intermediate/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/intermediate/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"intermediate"}},[_c('span',[_v("Intermediate")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intermediate","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.html b/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.html index 3e7c47190d..8f5ca1ad32 100644 --- a/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.html +++ b/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: practice KISSing

    Implementation → Code Quality → Readability → Intermediate → -

    Practice KISSing

    Do not try to write ‘clever’ code. "Keep it simple, stupid” (KISS), as the old adage goes. For example, do not dismiss the brute-force yet simple solution in favor of a complicated one because of some ‘supposed benefits’ such as 'better reusability' unless you have a strong justification.

    Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Brian W. Kernighan

    Programs must be written for people to read, and only incidentally for machines to execute. -- Abelson and Sussman

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Practice KISSing

    Do not try to write ‘clever’ code. "Keep it simple, stupid” (KISS), as the old adage goes. For example, do not dismiss the brute-force yet simple solution in favor of a complicated one because of some ‘supposed benefits’ such as 'better reusability' unless you have a strong justification.

    Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. -- Brian W. Kernighan

    Programs must be written for people to read, and only incidentally for machines to execute. -- Abelson and Sussman

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.page-vue-render.js b/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.page-vue-render.js index b8780e1822..2691bd386c 100644 --- a/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/intermediate/practiceKISSing/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: practice KISSing ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Readability → Intermediate →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"practice-kissing"}},[_c('span',[_v("Practice KISSing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#practice-kissing","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Do not try to write ‘clever’ code. \"Keep it simple, stupid” (KISS)")]),_v(", as the old adage goes. For example, do not dismiss the brute-force yet simple solution in favor of a complicated one because of some ‘supposed benefits’ such as 'better reusability' unless you have a strong justification.")]),_v(" "),_c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("-- Brian W. Kernighan ")])])]),_v(" "),_c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" Programs must be written for people to read, and only incidentally for machines to execute. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("-- Abelson and Sussman")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/intermediate/slapHard/index.html b/book/codeQuality/maximizeReadability/intermediate/slapHard/index.html index fd60bbab11..30269a3ced 100644 --- a/book/codeQuality/maximizeReadability/intermediate/slapHard/index.html +++ b/book/codeQuality/maximizeReadability/intermediate/slapHard/index.html @@ -221,7 +221,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/intermediate/slapHard/index.page-vue-render.js b/book/codeQuality/maximizeReadability/intermediate/slapHard/index.page-vue-render.js index 387250394c..16fec4a59f 100644 --- a/book/codeQuality/maximizeReadability/intermediate/slapHard/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/intermediate/slapHard/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Also ensure that the code is written with(this){return _c('p',[_c('strong',[_v("That said, it is sometimes possible to pack "),_c('em',[_v("two")]),_v(" levels of abstraction into the code")]),_v(" without affecting readability that much, provided each step in the higher-level logic is clearly marked using comments and separated (e.g., using a blank line) from adjacent steps.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.html b/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.html index 589e385b78..adcf3627fa 100644 --- a/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.html +++ b/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.html @@ -99,7 +99,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.page-vue-render.js b/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.page-vue-render.js index 22c0078a31..31d9274734 100644 --- a/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/intermediate/structureCodeLogically/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"structure-code-logically"}},[_ with(this){return _c('p',[_c('strong',[_v("Lay out the code so that it adheres to the logical structure.")]),_v(" The code should read like a story. Just like how you use section breaks, chapters and paragraphs to organize a story, use classes, methods, indentation and line spacing in your code to group related segments of the code. For example, you can use blank lines to separate groups of related statements.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/maximizeReadability/introduction/index.html b/book/codeQuality/maximizeReadability/introduction/index.html index cd6462cb82..e3e4a46ff7 100644 --- a/book/codeQuality/maximizeReadability/introduction/index.html +++ b/book/codeQuality/maximizeReadability/introduction/index.html @@ -13,7 +13,7 @@

    Can explain the importance of readability

    Implementation → Code Quality → Readability → -

    Introduction

    Programs should be written and polished until they acquire publication quality. --Niklaus Wirth

    Among various dimensions of code quality, such as run-time efficiency, security, and robustness, one of the most important is readability (aka understandability). This is because in any non-trivial software project, code needs to be read, understood, and modified by other developers later on. Even if you do not intend to pass the code to someone else, code quality is still important because you will become a 'stranger' to your own code someday.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    Programs should be written and polished until they acquire publication quality. --Niklaus Wirth

    Among various dimensions of code quality, such as run-time efficiency, security, and robustness, one of the most important is readability (aka understandability). This is because in any non-trivial software project, code needs to be read, understood, and modified by other developers later on. Even if you do not intend to pass the code to someone else, code quality is still important because you will become a 'stranger' to your own code someday.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/maximizeReadability/introduction/index.page-vue-render.js b/book/codeQuality/maximizeReadability/introduction/index.page-vue-render.js index 494b33fa71..6f97698941 100644 --- a/book/codeQuality/maximizeReadability/introduction/index.page-vue-render.js +++ b/book/codeQuality/maximizeReadability/introduction/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain the importance of readability")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Readability →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" Programs should be written and polished until they acquire publication quality. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("--"),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Niklaus_Wirth"}},[_v("Niklaus Wirth")])])])]),_v(" "),_c('p',[_c('strong',[_v("Among various dimensions of code quality, such as run-time efficiency, security, and robustness, one of the most important is readability")]),_v(" (aka understandability). This is because in any non-trivial software project, code needs to be read, understood, and modified by other developers later on. Even if you do not intend to pass the code to someone else, code quality is still important because you will become a 'stranger' to your own code someday.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/basic/index.html b/book/codeQuality/nameWell/basic/index.html index 026b6f88b5..9b94c66f91 100644 --- a/book/codeQuality/nameWell/basic/index.html +++ b/book/codeQuality/nameWell/basic/index.html @@ -87,7 +87,7 @@ -

    Use standard words

    Can improve code quality using technique: use standard words

    Use correct spelling in names. Avoid 'texting-style' spelling. Avoid foreign language words, slang, and names that are only meaningful within specific contexts/times e.g. terms from private jokes, a TV show currently popular in your country.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Use standard words

    Can improve code quality using technique: use standard words

    Use correct spelling in names. Avoid 'texting-style' spelling. Avoid foreign language words, slang, and names that are only meaningful within specific contexts/times e.g. terms from private jokes, a TV show currently popular in your country.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/basic/index.page-vue-render.js b/book/codeQuality/nameWell/basic/index.page-vue-render.js index cf3b370335..3ae090d09b 100644 --- a/book/codeQuality/nameWell/basic/index.page-vue-render.js +++ b/book/codeQuality/nameWell/basic/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"basic"}},[_c('span',[_v("Basic")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#basic","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.html b/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.html index d03cef935a..35b166b006 100644 --- a/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.html +++ b/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.html @@ -87,7 +87,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.page-vue-render.js b/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.page-vue-render.js index 0eb9a794ec..7396056425 100644 --- a/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.page-vue-render.js +++ b/book/codeQuality/nameWell/basic/nounsAndVerbsAsNames/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Use nouns for classes/variables and v with(this){return _c('p',[_c('strong',[_v("Distinguish clearly between single-valued and multi-valued variables.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/basic/useStandardWords/index.html b/book/codeQuality/nameWell/basic/useStandardWords/index.html index 4766bd55d1..5d9e4bac91 100644 --- a/book/codeQuality/nameWell/basic/useStandardWords/index.html +++ b/book/codeQuality/nameWell/basic/useStandardWords/index.html @@ -13,7 +13,7 @@ +

    Use standard words

    Use correct spelling in names. Avoid 'texting-style' spelling. Avoid foreign language words, slang, and names that are only meaningful within specific contexts/times e.g. terms from private jokes, a TV show currently popular in your country.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/basic/useStandardWords/index.page-vue-render.js b/book/codeQuality/nameWell/basic/useStandardWords/index.page-vue-render.js index 7ccbd643fb..b19b46da43 100644 --- a/book/codeQuality/nameWell/basic/useStandardWords/index.page-vue-render.js +++ b/book/codeQuality/nameWell/basic/useStandardWords/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: use standard words ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Naming → Basic →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"use-standard-words"}},[_c('span',[_v("Use standard words")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#use-standard-words","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Use correct spelling in names. Avoid 'texting-style' spelling. "),_c('strong',[_v("Avoid foreign language words, slang, and names that are only meaningful within specific contexts/times")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. terms from private jokes, a TV show currently popular in your country.")])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/index.html b/book/codeQuality/nameWell/index.html index 499354b6b3..45f888c908 100644 --- a/book/codeQuality/nameWell/index.html +++ b/book/codeQuality/nameWell/index.html @@ -87,7 +87,7 @@ -

    Use standard words

    Can improve code quality using technique: use standard words

    Use correct spelling in names. Avoid 'texting-style' spelling. Avoid foreign language words, slang, and names that are only meaningful within specific contexts/times e.g. terms from private jokes, a TV show currently popular in your country.



    Intermediate

    Use name to explain

    Can improve code quality using technique: use name to explain

    A name is not just for differentiation; it should explain the named entity to the reader accurately and at a sufficient level of detail.

    Bad Good
    processInput() (what 'process'?) removeWhiteSpaceFromInput()
    flag isValidInput
    temp

    If a name has multiple words, they should be in a sensible order.

    Bad Good
    bySizeOrder() orderBySize()

    Imagine going to the doctor's and saying "My eye1 is swollen"! Don’t use numbers or case to distinguish names.

    Bad Bad Good
    value1, value2 value, Value originalValue, finalValue

    Not too long, not too short

    Can improve code quality using technique: not too long, not too short

    While it is preferable not to have lengthy names, names that are 'too short' are even worse. If you must abbreviate or use acronyms, do it consistently. Explain their full meaning at an obvious location.


    Avoid misleading names

    Can improve code quality using technique: avoid misleading names

    Related things should be named similarly, while unrelated things should NOT.

    Example: Consider these variables

    • colorBlack: hex value for color black
    • colorWhite: hex value for color white
    • colorBlue: number of times blue is used
    • hexForRed: hex value for color red

    This is misleading because colorBlue is named similar to colorWhite and colorBlack but has a different purpose while hexForRed is named differently but has a very similar purpose to the first two variables. The following is better:

    • hexForBlack hexForWhite hexForRed
    • blueColorCount

    Avoid misleading or ambiguous names (e.g. those with multiple meanings), similar sounding names, hard-to-pronounce ones (e.g. avoid ambiguities like "is that a lowercase L, capital I or number 1?", or "is that number 0 or letter O?"), almost similar names.

    Bad Good Reason
    phase0 phaseZero Is that zero or letter O?
    rwrLgtDirn rowerLegitDirection Hard to pronounce
    right left wrong rightDirection leftDirection wrongResponse right is for 'correct' or 'opposite of 'left'?
    redBooks readBooks redColorBooks booksRead red and read (past tense) sounds the same
    FiletMignon egg If the requirement is just a name of a food, egg is a much easier to type/say choice than FiletMignon


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Use standard words

    Can improve code quality using technique: use standard words

    Use correct spelling in names. Avoid 'texting-style' spelling. Avoid foreign language words, slang, and names that are only meaningful within specific contexts/times e.g. terms from private jokes, a TV show currently popular in your country.



    Intermediate

    Use name to explain

    Can improve code quality using technique: use name to explain

    A name is not just for differentiation; it should explain the named entity to the reader accurately and at a sufficient level of detail.

    Bad Good
    processInput() (what 'process'?) removeWhiteSpaceFromInput()
    flag isValidInput
    temp

    If a name has multiple words, they should be in a sensible order.

    Bad Good
    bySizeOrder() orderBySize()

    Imagine going to the doctor's and saying "My eye1 is swollen"! Don’t use numbers or case to distinguish names.

    Bad Bad Good
    value1, value2 value, Value originalValue, finalValue

    Not too long, not too short

    Can improve code quality using technique: not too long, not too short

    While it is preferable not to have lengthy names, names that are 'too short' are even worse. If you must abbreviate or use acronyms, do it consistently. Explain their full meaning at an obvious location.


    Avoid misleading names

    Can improve code quality using technique: avoid misleading names

    Related things should be named similarly, while unrelated things should NOT.

    Example: Consider these variables

    • colorBlack: hex value for color black
    • colorWhite: hex value for color white
    • colorBlue: number of times blue is used
    • hexForRed: hex value for color red

    This is misleading because colorBlue is named similar to colorWhite and colorBlack but has a different purpose while hexForRed is named differently but has a very similar purpose to the first two variables. The following is better:

    • hexForBlack hexForWhite hexForRed
    • blueColorCount

    Avoid misleading or ambiguous names (e.g. those with multiple meanings), similar sounding names, hard-to-pronounce ones (e.g. avoid ambiguities like "is that a lowercase L, capital I or number 1?", or "is that number 0 or letter O?"), almost similar names.

    Bad Good Reason
    phase0 phaseZero Is that zero or letter O?
    rwrLgtDirn rowerLegitDirection Hard to pronounce
    right left wrong rightDirection leftDirection wrongResponse right is for 'correct' or 'opposite of 'left'?
    redBooks readBooks redColorBooks booksRead red and read (past tense) sounds the same
    FiletMignon egg If the requirement is just a name of a food, egg is a much easier to type/say choice than FiletMignon


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/index.page-vue-render.js b/book/codeQuality/nameWell/index.page-vue-render.js index 962185bd17..c484e0e771 100644 --- a/book/codeQuality/nameWell/index.page-vue-render.js +++ b/book/codeQuality/nameWell/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-name-well"}},[_c('span',[_v("Guideline: Name well")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-name-well","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.html b/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.html index 04c61380e2..c2b15906ef 100644 --- a/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.html +++ b/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: avoid misleading names

    Implementation → Code Quality → Naming → Intermediate → -

    Avoid misleading names

    Related things should be named similarly, while unrelated things should NOT.

    Example: Consider these variables

    • colorBlack: hex value for color black
    • colorWhite: hex value for color white
    • colorBlue: number of times blue is used
    • hexForRed: hex value for color red

    This is misleading because colorBlue is named similar to colorWhite and colorBlack but has a different purpose while hexForRed is named differently but has a very similar purpose to the first two variables. The following is better:

    • hexForBlack hexForWhite hexForRed
    • blueColorCount

    Avoid misleading or ambiguous names (e.g. those with multiple meanings), similar sounding names, hard-to-pronounce ones (e.g. avoid ambiguities like "is that a lowercase L, capital I or number 1?", or "is that number 0 or letter O?"), almost similar names.

    Bad Good Reason
    phase0 phaseZero Is that zero or letter O?
    rwrLgtDirn rowerLegitDirection Hard to pronounce
    right left wrong rightDirection leftDirection wrongResponse right is for 'correct' or 'opposite of 'left'?
    redBooks readBooks redColorBooks booksRead red and read (past tense) sounds the same
    FiletMignon egg If the requirement is just a name of a food, egg is a much easier to type/say choice than FiletMignon
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Avoid misleading names

    Related things should be named similarly, while unrelated things should NOT.

    Example: Consider these variables

    • colorBlack: hex value for color black
    • colorWhite: hex value for color white
    • colorBlue: number of times blue is used
    • hexForRed: hex value for color red

    This is misleading because colorBlue is named similar to colorWhite and colorBlack but has a different purpose while hexForRed is named differently but has a very similar purpose to the first two variables. The following is better:

    • hexForBlack hexForWhite hexForRed
    • blueColorCount

    Avoid misleading or ambiguous names (e.g. those with multiple meanings), similar sounding names, hard-to-pronounce ones (e.g. avoid ambiguities like "is that a lowercase L, capital I or number 1?", or "is that number 0 or letter O?"), almost similar names.

    Bad Good Reason
    phase0 phaseZero Is that zero or letter O?
    rwrLgtDirn rowerLegitDirection Hard to pronounce
    right left wrong rightDirection leftDirection wrongResponse right is for 'correct' or 'opposite of 'left'?
    redBooks readBooks redColorBooks booksRead red and read (past tense) sounds the same
    FiletMignon egg If the requirement is just a name of a food, egg is a much easier to type/say choice than FiletMignon
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.page-vue-render.js b/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.page-vue-render.js index d75d440774..727faba9df 100644 --- a/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.page-vue-render.js +++ b/book/codeQuality/nameWell/intermediate/avoidMisleadingNames/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"avoid-misleading-names"}},[_c( with(this){return _c('p',[_c('strong',[_v("Related things should be named similarly, while unrelated things should NOT.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/intermediate/index.html b/book/codeQuality/nameWell/intermediate/index.html index 6622ba3ac1..8bff99ab0f 100644 --- a/book/codeQuality/nameWell/intermediate/index.html +++ b/book/codeQuality/nameWell/intermediate/index.html @@ -13,7 +13,7 @@

    Implementation → Code Quality → Naming → -

    Intermediate

    Use name to explain

    Can improve code quality using technique: use name to explain

    A name is not just for differentiation; it should explain the named entity to the reader accurately and at a sufficient level of detail.

    Bad Good
    processInput() (what 'process'?) removeWhiteSpaceFromInput()
    flag isValidInput
    temp

    If a name has multiple words, they should be in a sensible order.

    Bad Good
    bySizeOrder() orderBySize()

    Imagine going to the doctor's and saying "My eye1 is swollen"! Don’t use numbers or case to distinguish names.

    Bad Bad Good
    value1, value2 value, Value originalValue, finalValue

    Not too long, not too short

    Can improve code quality using technique: not too long, not too short

    While it is preferable not to have lengthy names, names that are 'too short' are even worse. If you must abbreviate or use acronyms, do it consistently. Explain their full meaning at an obvious location.


    Avoid misleading names

    Can improve code quality using technique: avoid misleading names

    Related things should be named similarly, while unrelated things should NOT.

    Example: Consider these variables

    • colorBlack: hex value for color black
    • colorWhite: hex value for color white
    • colorBlue: number of times blue is used
    • hexForRed: hex value for color red

    This is misleading because colorBlue is named similar to colorWhite and colorBlack but has a different purpose while hexForRed is named differently but has a very similar purpose to the first two variables. The following is better:

    • hexForBlack hexForWhite hexForRed
    • blueColorCount

    Avoid misleading or ambiguous names (e.g. those with multiple meanings), similar sounding names, hard-to-pronounce ones (e.g. avoid ambiguities like "is that a lowercase L, capital I or number 1?", or "is that number 0 or letter O?"), almost similar names.

    Bad Good Reason
    phase0 phaseZero Is that zero or letter O?
    rwrLgtDirn rowerLegitDirection Hard to pronounce
    right left wrong rightDirection leftDirection wrongResponse right is for 'correct' or 'opposite of 'left'?
    redBooks readBooks redColorBooks booksRead red and read (past tense) sounds the same
    FiletMignon egg If the requirement is just a name of a food, egg is a much easier to type/say choice than FiletMignon

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Intermediate

    Use name to explain

    Can improve code quality using technique: use name to explain

    A name is not just for differentiation; it should explain the named entity to the reader accurately and at a sufficient level of detail.

    Bad Good
    processInput() (what 'process'?) removeWhiteSpaceFromInput()
    flag isValidInput
    temp

    If a name has multiple words, they should be in a sensible order.

    Bad Good
    bySizeOrder() orderBySize()

    Imagine going to the doctor's and saying "My eye1 is swollen"! Don’t use numbers or case to distinguish names.

    Bad Bad Good
    value1, value2 value, Value originalValue, finalValue

    Not too long, not too short

    Can improve code quality using technique: not too long, not too short

    While it is preferable not to have lengthy names, names that are 'too short' are even worse. If you must abbreviate or use acronyms, do it consistently. Explain their full meaning at an obvious location.


    Avoid misleading names

    Can improve code quality using technique: avoid misleading names

    Related things should be named similarly, while unrelated things should NOT.

    Example: Consider these variables

    • colorBlack: hex value for color black
    • colorWhite: hex value for color white
    • colorBlue: number of times blue is used
    • hexForRed: hex value for color red

    This is misleading because colorBlue is named similar to colorWhite and colorBlack but has a different purpose while hexForRed is named differently but has a very similar purpose to the first two variables. The following is better:

    • hexForBlack hexForWhite hexForRed
    • blueColorCount

    Avoid misleading or ambiguous names (e.g. those with multiple meanings), similar sounding names, hard-to-pronounce ones (e.g. avoid ambiguities like "is that a lowercase L, capital I or number 1?", or "is that number 0 or letter O?"), almost similar names.

    Bad Good Reason
    phase0 phaseZero Is that zero or letter O?
    rwrLgtDirn rowerLegitDirection Hard to pronounce
    right left wrong rightDirection leftDirection wrongResponse right is for 'correct' or 'opposite of 'left'?
    redBooks readBooks redColorBooks booksRead red and read (past tense) sounds the same
    FiletMignon egg If the requirement is just a name of a food, egg is a much easier to type/say choice than FiletMignon

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/intermediate/index.page-vue-render.js b/book/codeQuality/nameWell/intermediate/index.page-vue-render.js index 0af0ac272b..9fdcdad005 100644 --- a/book/codeQuality/nameWell/intermediate/index.page-vue-render.js +++ b/book/codeQuality/nameWell/intermediate/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"intermediate"}},[_c('span',[_v("Intermediate")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intermediate","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.html b/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.html index ef2f9e3a0a..dee900c4ba 100644 --- a/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.html +++ b/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.html @@ -13,7 +13,7 @@ +

    Not too long, not too short

    While it is preferable not to have lengthy names, names that are 'too short' are even worse. If you must abbreviate or use acronyms, do it consistently. Explain their full meaning at an obvious location.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.page-vue-render.js b/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.page-vue-render.js index 6df92330a5..312f67abf7 100644 --- a/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.page-vue-render.js +++ b/book/codeQuality/nameWell/intermediate/notTooLongNorShort/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can improve code quality using technique: not too long, not too short ")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Naming → Intermediate →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"not-too-long-not-too-short"}},[_c('span',[_v("Not too long, not too short")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#not-too-long-not-too-short","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("While it is preferable not to have lengthy names, names that are 'too short' are even worse. If you must abbreviate or use acronyms, do it consistently. Explain their full meaning at an obvious location.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/intermediate/useNameExplain/index.html b/book/codeQuality/nameWell/intermediate/useNameExplain/index.html index 987b71d5cd..4c142f3947 100644 --- a/book/codeQuality/nameWell/intermediate/useNameExplain/index.html +++ b/book/codeQuality/nameWell/intermediate/useNameExplain/index.html @@ -13,7 +13,7 @@

    Can improve code quality using technique: use name to explain

    Implementation → Code Quality → Naming → Intermediate → -

    Use name to explain

    A name is not just for differentiation; it should explain the named entity to the reader accurately and at a sufficient level of detail.

    Bad Good
    processInput() (what 'process'?) removeWhiteSpaceFromInput()
    flag isValidInput
    temp

    If a name has multiple words, they should be in a sensible order.

    Bad Good
    bySizeOrder() orderBySize()

    Imagine going to the doctor's and saying "My eye1 is swollen"! Don’t use numbers or case to distinguish names.

    Bad Bad Good
    value1, value2 value, Value originalValue, finalValue
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Use name to explain

    A name is not just for differentiation; it should explain the named entity to the reader accurately and at a sufficient level of detail.

    Bad Good
    processInput() (what 'process'?) removeWhiteSpaceFromInput()
    flag isValidInput
    temp

    If a name has multiple words, they should be in a sensible order.

    Bad Good
    bySizeOrder() orderBySize()

    Imagine going to the doctor's and saying "My eye1 is swollen"! Don’t use numbers or case to distinguish names.

    Bad Bad Good
    value1, value2 value, Value originalValue, finalValue
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/intermediate/useNameExplain/index.page-vue-render.js b/book/codeQuality/nameWell/intermediate/useNameExplain/index.page-vue-render.js index 657dde443e..ff4aeb6190 100644 --- a/book/codeQuality/nameWell/intermediate/useNameExplain/index.page-vue-render.js +++ b/book/codeQuality/nameWell/intermediate/useNameExplain/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("A name is not just for differentiatio with(this){return _c('p',[_c('strong',[_v("If a name has multiple words, they should be in a sensible order.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/codeQuality/nameWell/introduction/index.html b/book/codeQuality/nameWell/introduction/index.html index 38b07f784a..41fef9c3b5 100644 --- a/book/codeQuality/nameWell/introduction/index.html +++ b/book/codeQuality/nameWell/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    Proper naming improves the readability of code. It also reduces bugs caused by ambiguities regarding the intent of a variable or a method.

    There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/codeQuality/nameWell/introduction/index.page-vue-render.js b/book/codeQuality/nameWell/introduction/index.page-vue-render.js index 3eff12dc89..8b41e5b4bd 100644 --- a/book/codeQuality/nameWell/introduction/index.page-vue-render.js +++ b/book/codeQuality/nameWell/introduction/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain the need for good names in code")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Code Quality → Naming →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Proper naming improves the readability of code. It also reduces bugs caused by ambiguities regarding the intent of a variable or a method.")]),_v(" "),_c('blockquote',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]),_v(" There are only two hard things in Computer Science: cache invalidation and naming things. "),_c('span',[_c('span',{staticClass:"fas fa-quote-right",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('sub',[_v("-- Phil Karlton")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/combined/exercises.html b/book/combined/exercises.html index 320292af60..1c9263e41b 100644 --- a/book/combined/exercises.html +++ b/book/combined/exercises.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Combined Exercises

    Here are some exercises that combine multiple topics.

    Choose the correct statement about requirements.

    Choose the correct statement


    Class Diagrams vs Object Diagrams vs Sequence Diagrams

    Choose the incorrect statement.


    Which one of these is the most useful to describe a workflow?

    Which one of these is the most useful to model a workflow?


    Pick the odd one out of these project management tools/techniques.

    Pick the odd one out.


    Choose the least correct statement about principles and patterns.

    Choose the least correct statement


    Are you able to interpret CD/OD notations?

    Study the following class and object diagrams. Are you able to interpret all notations?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Combined Exercises

    Here are some exercises that combine multiple topics.

    Choose the correct statement about requirements.

    Choose the correct statement


    Class Diagrams vs Object Diagrams vs Sequence Diagrams

    Choose the incorrect statement.


    Which one of these is the most useful to describe a workflow?

    Which one of these is the most useful to model a workflow?


    Pick the odd one out of these project management tools/techniques.

    Pick the odd one out.


    Choose the least correct statement about principles and patterns.

    Choose the least correct statement


    Are you able to interpret CD/OD notations?

    Study the following class and object diagrams. Are you able to interpret all notations?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/combined/exercises.page-vue-render.js b/book/combined/exercises.page-vue-render.js index e8ccf7f2fc..c0611f776f 100644 --- a/book/combined/exercises.page-vue-render.js +++ b/book/combined/exercises.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('h2',{attrs:{"id":"combined-exercises"}},[_v("Combined Exercises"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#combined-exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/about/index.html b/book/cppToJava/about/index.html index a58e0d453e..a49651c714 100644 --- a/book/cppToJava/about/index.html +++ b/book/cppToJava/about/index.html @@ -13,7 +13,7 @@

    C++ to Java → -

    About this chapter

    This book chapter assumes you are familiar with basic C++ programming. It provides a crash course to help you migrate from C++ to Java.

    This chapter borrows heavily from the excellent book ThinkJava by Allen Downey and Chris Mayfield. As required by the terms of reuse of that book, this chapter is released under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and not under the MIT license as the rest of this book.

    Some conventions used in this chapter:

    icon marks the description of an aspect of Java that works mostly similar to C++

    icon marks the description of an aspect of Java that is distinctly different from C++

    Other resources used:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    About this chapter

    This book chapter assumes you are familiar with basic C++ programming. It provides a crash course to help you migrate from C++ to Java.

    This chapter borrows heavily from the excellent book ThinkJava by Allen Downey and Chris Mayfield. As required by the terms of reuse of that book, this chapter is released under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License and not under the MIT license as the rest of this book.

    Some conventions used in this chapter:

    icon marks the description of an aspect of Java that works mostly similar to C++

    icon marks the description of an aspect of Java that is distinctly different from C++

    Other resources used:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/about/index.page-vue-render.js b/book/cppToJava/about/index.page-vue-render.js index 6f948e9655..ded8fce4d3 100644 --- a/book/cppToJava/about/index.page-vue-render.js +++ b/book/cppToJava/about/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span')])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"about-this-chapter"}},[_c('span',[_v("About this chapter")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#about-this-chapter","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',{staticClass:"lead"},[_c('span',[_v("This book chapter "),_c('strong',[_v("assumes you are familiar with basic C++ programming")]),_v(". It provides a crash course to help you migrate from C++ to Java.")])]),_v(" "),_c('p',[_v("This chapter "),_c('strong',[_v("borrows heavily from the excellent book "),_c('a',{attrs:{"href":"http://greenteapress.com/wp/think-java/"}},[_c('em',[_v("ThinkJava")])])]),_v(" by Allen Downey and Chris Mayfield. As required by the "),_c('em',[_v("terms of reuse")]),_v(" of that book, this chapter is released under the "),_c('a',{attrs:{"href":"http://creativecommons.org/licenses/by-nc-sa/3.0/"}},[_v("Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License")]),_v(" and not under the MIT license as the rest of this book.")]),_v(" "),_c('p',[_v("Some conventions used in this chapter:")]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_c('span',[_c('span',{staticClass:"fas fa-equals",attrs:{"aria-hidden":"true"}})])])]),_v(" icon marks the description of an aspect of Java that works mostly similar to C++")]),_v(" "),_c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{staticClass:"badge rounded-pill bg-danger"},[_c('span',[_c('span',{staticClass:"fas fa-not-equal",attrs:{"aria-hidden":"true"}})])])]),_v(" icon marks the description of an aspect of Java that is distinctly different from C++")])]),_v(" "),_c('p',[_v("Other resources used:")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.cprogramming.com/tutorial/java/syntax-differences-java-c++.html"}},[_v("C++ and Java Syntax Differences Cheat Sheet")]),_v(" by Alex Allain")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/"}},[_c('em',[_v("Java Tutorial")]),_v(" provided by Oracle")]),_v(". Extracts from this resource are marked as "),_c('small',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{staticClass:"badge bg-secondary"},[_v("-- Java Tutorial")])])])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/classes/classLevelMembers/index.html b/book/cppToJava/classes/classLevelMembers/index.html index 145c369095..c8ef342a4f 100644 --- a/book/cppToJava/classes/classLevelMembers/index.html +++ b/book/cppToJava/classes/classLevelMembers/index.html @@ -300,7 +300,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/classes/classLevelMembers/index.page-vue-render.js b/book/cppToJava/classes/classLevelMembers/index.page-vue-render.js index 4a5316e7dd..38e42be3fe 100644 --- a/book/cppToJava/classes/classLevelMembers/index.page-vue-render.js +++ b/book/cppToJava/classes/classLevelMembers/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_c('strong',[_v("The "),_c('code',{pre:true,attrs:{"cl with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/classes/definingClasses/index.html b/book/cppToJava/classes/definingClasses/index.html index a2ecffccdd..7da95b3332 100644 --- a/book/cppToJava/classes/definingClasses/index.html +++ b/book/cppToJava/classes/definingClasses/index.html @@ -379,7 +379,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/classes/definingClasses/index.page-vue-render.js b/book/cppToJava/classes/definingClasses/index.page-vue-render.js index b4e1c9f93e..5c97140be1 100644 --- a/book/cppToJava/classes/definingClasses/index.page-vue-render.js +++ b/book/cppToJava/classes/definingClasses/index.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('p',[_c('strong',[_v("You can add methods to a class which with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/classes/gettersAndSetters/index.html b/book/cppToJava/classes/gettersAndSetters/index.html index 4a08258271..bdb14e0b07 100644 --- a/book/cppToJava/classes/gettersAndSetters/index.html +++ b/book/cppToJava/classes/gettersAndSetters/index.html @@ -256,7 +256,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/classes/gettersAndSetters/index.page-vue-render.js b/book/cppToJava/classes/gettersAndSetters/index.page-vue-render.js index 00ce7453fa..cbc4511a64 100644 --- a/book/cppToJava/classes/gettersAndSetters/index.page-vue-render.js +++ b/book/cppToJava/classes/gettersAndSetters/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/classes/index.html b/book/cppToJava/classes/index.html index 8d2b2f01f4..c159cc1e11 100644 --- a/book/cppToJava/classes/index.html +++ b/book/cppToJava/classes/index.html @@ -909,7 +909,7 @@ -

    Hint




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/classes/index.page-vue-render.js b/book/cppToJava/classes/index.page-vue-render.js index 8e84939f3e..d2cbe972a4 100644 --- a/book/cppToJava/classes/index.page-vue-render.js +++ b/book/cppToJava/classes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"java-classes"}},[_c('span',[_v("Java classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#java-classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/collections/arrayListClass/index.html b/book/cppToJava/collections/arrayListClass/index.html index 57fdab5ca7..7037edef83 100644 --- a/book/cppToJava/collections/arrayListClass/index.html +++ b/book/cppToJava/collections/arrayListClass/index.html @@ -234,7 +234,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/collections/arrayListClass/index.page-vue-render.js b/book/cppToJava/collections/arrayListClass/index.page-vue-render.js index 8e83e8a114..a0b6317cea 100644 --- a/book/cppToJava/collections/arrayListClass/index.page-vue-render.js +++ b/book/cppToJava/collections/arrayListClass/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/collections/hashMapClass/index.html b/book/cppToJava/collections/hashMapClass/index.html index 58585fcac6..fdb0295a3c 100644 --- a/book/cppToJava/collections/hashMapClass/index.html +++ b/book/cppToJava/collections/hashMapClass/index.html @@ -227,7 +227,7 @@ -

    Hint




    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint




    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/collections/hashMapClass/index.page-vue-render.js b/book/cppToJava/collections/hashMapClass/index.page-vue-render.js index 2891fc91c7..ea3d5a7ba3 100644 --- a/book/cppToJava/collections/hashMapClass/index.page-vue-render.js +++ b/book/cppToJava/collections/hashMapClass/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{stat with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/util/HashMap.html"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("HashMap")]),_v(" API")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.journaldev.com/11560/java-hashmap"}},[_v("A tutorial on HashMaps")]),_v(" from journaldev.com")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/collections/index.html b/book/cppToJava/collections/index.html index da9b4c5390..023854410f 100644 --- a/book/cppToJava/collections/index.html +++ b/book/cppToJava/collections/index.html @@ -448,7 +448,7 @@ -

    Hint




    Resources:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint




    Resources:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/collections/index.page-vue-render.js b/book/cppToJava/collections/index.page-vue-render.js index b11ae70a96..690c3ba617 100644 --- a/book/cppToJava/collections/index.page-vue-render.js +++ b/book/cppToJava/collections/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"collections"}},[_c('span',[_v("Collections")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#collections","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/collections/what/index.html b/book/cppToJava/collections/what/index.html index 987067dfaf..e2f9a30273 100644 --- a/book/cppToJava/collections/what/index.html +++ b/book/cppToJava/collections/what/index.html @@ -13,7 +13,7 @@

    Can explain the Collections framework

    C++ to Java → Collections → -

    The collections framework

    This section uses extracts from the -- Java Tutorial, with some adaptations.

    A collection — sometimes called a container — is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.

    Typically, collections represent data items that form a natural group, such as a poker hand (a collection of cards), a mail folder (a collection of letters), or a telephone directory (a mapping of names to phone numbers).

    The collections framework is a unified architecture for representing and manipulating collections. It contains the following:

    • Interfaces: These are abstract data types that represent collections. Interfaces allow collections to be manipulated independently of the details of their representation.
      Example: the List<E> interface can be used to manipulate list-like collections which may be implemented in different ways such as ArrayList<E> or LinkedList<E>.

    • Implementations: These are the concrete implementations of the collection interfaces. In essence, they are reusable data structures.
      Example: the ArrayList<E> class implements the List<E> interface while the HashMap<K, V> class implements the Map<K, V> interface.

    • Algorithms: These are the methods that perform useful computations, such as searching and sorting, on objects that implement collection interfaces. The algorithms are said to be polymorphic: that is, the same method can be used on many different implementations of the appropriate collection interface.
      Example: the sort(List<E>) method can sort a collection that implements the List<E> interface.

    A well-known example of collections frameworks is the C++ Standard Template Library (STL). Although both are collections frameworks and the syntax look similar, note that there are important philosophical and implementation differences between the two.

    The following list describes the core collection interfaces:

    • Collection — the root of the collection hierarchy. A collection represents a group of objects known as its elements. The Collection interface is the least common denominator that all collections implement and is used to pass collections around and to manipulate them when maximum generality is desired. Some types of collections allow duplicate elements, and others do not. Some are ordered and others are unordered. The Java platform doesn't provide any direct implementations of this interface but provides implementations of more specific subinterfaces, such as Set and List. Also see the Collection API.

    • Set — a collection that cannot contain duplicate elements. This interface models the mathematical set abstraction and is used to represent sets, such as the cards comprising a poker hand, the courses making up a student's schedule, or the processes running on a machine. Also see the Set API.

    • List — an ordered collection (sometimes called a sequence). Lists can contain duplicate elements. The user of a List generally has precise control over where in the list each element is inserted and can access elements by their integer index (position). Also see the List API.

    • Queue — a collection used to hold multiple elements prior to processing. Besides basic Collection operations, a Queue provides additional insertion, extraction, and inspection operations. Also see the Queue API.

    • Map — an object that maps keys to values. A Map cannot contain duplicate keys; each key can map to at most one value. Also see the Map API.

    • Others: Deque, SortedSet, SortedMap

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The collections framework

    This section uses extracts from the -- Java Tutorial, with some adaptations.

    A collection — sometimes called a container — is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.

    Typically, collections represent data items that form a natural group, such as a poker hand (a collection of cards), a mail folder (a collection of letters), or a telephone directory (a mapping of names to phone numbers).

    The collections framework is a unified architecture for representing and manipulating collections. It contains the following:

    • Interfaces: These are abstract data types that represent collections. Interfaces allow collections to be manipulated independently of the details of their representation.
      Example: the List<E> interface can be used to manipulate list-like collections which may be implemented in different ways such as ArrayList<E> or LinkedList<E>.

    • Implementations: These are the concrete implementations of the collection interfaces. In essence, they are reusable data structures.
      Example: the ArrayList<E> class implements the List<E> interface while the HashMap<K, V> class implements the Map<K, V> interface.

    • Algorithms: These are the methods that perform useful computations, such as searching and sorting, on objects that implement collection interfaces. The algorithms are said to be polymorphic: that is, the same method can be used on many different implementations of the appropriate collection interface.
      Example: the sort(List<E>) method can sort a collection that implements the List<E> interface.

    A well-known example of collections frameworks is the C++ Standard Template Library (STL). Although both are collections frameworks and the syntax look similar, note that there are important philosophical and implementation differences between the two.

    The following list describes the core collection interfaces:

    • Collection — the root of the collection hierarchy. A collection represents a group of objects known as its elements. The Collection interface is the least common denominator that all collections implement and is used to pass collections around and to manipulate them when maximum generality is desired. Some types of collections allow duplicate elements, and others do not. Some are ordered and others are unordered. The Java platform doesn't provide any direct implementations of this interface but provides implementations of more specific subinterfaces, such as Set and List. Also see the Collection API.

    • Set — a collection that cannot contain duplicate elements. This interface models the mathematical set abstraction and is used to represent sets, such as the cards comprising a poker hand, the courses making up a student's schedule, or the processes running on a machine. Also see the Set API.

    • List — an ordered collection (sometimes called a sequence). Lists can contain duplicate elements. The user of a List generally has precise control over where in the list each element is inserted and can access elements by their integer index (position). Also see the List API.

    • Queue — a collection used to hold multiple elements prior to processing. Besides basic Collection operations, a Queue provides additional insertion, extraction, and inspection operations. Also see the Queue API.

    • Map — an object that maps keys to values. A Map cannot contain duplicate keys; each key can map to at most one value. Also see the Map API.

    • Others: Deque, SortedSet, SortedMap

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/collections/what/index.page-vue-render.js b/book/cppToJava/collections/what/index.page-vue-render.js index a25d67fb80..40c43eed6f 100644 --- a/book/cppToJava/collections/what/index.page-vue-render.js +++ b/book/cppToJava/collections/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{ with(this){return _c('ul',[_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Collection")])]),_v(" — the root of the collection hierarchy. A collection represents a group of objects known as its elements. The Collection interface is the least common denominator that all collections implement and is used to pass collections around and to manipulate them when maximum generality is desired. Some types of collections allow duplicate elements, and others do not. Some are ordered and others are unordered. The Java platform doesn't provide any direct implementations of this interface but provides implementations of more specific subinterfaces, such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Set")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("List")]),_v(". "),_c('span',{staticClass:"dimmed"},[_v("Also see the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/util/Collection.html"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Collection")]),_v(" API")]),_v(".")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Set")])]),_v(" — a collection that cannot contain duplicate elements. This interface models the mathematical set abstraction and is used to represent sets, such as the cards comprising a poker hand, the courses making up a student's schedule, or the processes running on a machine. "),_c('span',{staticClass:"dimmed"},[_v("Also see the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/util/Set.html"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Set")]),_v(" API")]),_v(".")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("List")])]),_v(" — an ordered collection (sometimes called a "),_c('em',[_v("sequence")]),_v("). "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("List")]),_v("s can contain duplicate elements. The user of a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("List")]),_v(" generally has precise control over where in the list each element is inserted and can access elements by their integer index (position). "),_c('span',{staticClass:"dimmed"},[_v("Also see the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/util/List.html"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("List")]),_v(" API")]),_v(".")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Queue")])]),_v(" — a collection used to hold multiple elements prior to processing. Besides basic "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Collection")]),_v(" operations, a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Queue")]),_v(" provides additional insertion, extraction, and inspection operations. "),_c('span',{staticClass:"dimmed"},[_v("Also see the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/util/Queue.html"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Queue")]),_v(" API")]),_v(".")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Map")])]),_v(" — an object that maps keys to values. A "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Map")]),_v(" cannot contain duplicate keys; each key can map to at most one value. "),_c('span',{staticClass:"dimmed"},[_v("Also see the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/util/Map.html"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Map")]),_v(" API")]),_v(".")])])]),_v(" "),_c('li',[_c('p',[_v("Others: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Deque")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SortedSet")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("SortedMap")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/controlFlow/branching/index.html b/book/cppToJava/controlFlow/branching/index.html index 0dda65924d..46a7ea073e 100644 --- a/book/cppToJava/controlFlow/branching/index.html +++ b/book/cppToJava/controlFlow/branching/index.html @@ -288,7 +288,7 @@ -

    August


    Exercises:

    Greeter


    [Key Exercise] Grade Helper

    Write a Java program that takes a letter grade e.g., A+ as a command line argument and prints the CAP (aka GPA) value for that grade.

    Use a switch statement in your code.

    A+ A A- B+ B B- C Else
    5.0 5.0 4.5 4.0 3.5 3.0 2.5 0

    Follow the sample output given below.

    >_ java GradeHelper B CAP for grade B is 3.5

    You can assume that the input is always in the correct format i.e., no need to handle invalid input cases.

    Hint




    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    August


    Exercises:

    Greeter


    [Key Exercise] Grade Helper

    Write a Java program that takes a letter grade e.g., A+ as a command line argument and prints the CAP (aka GPA) value for that grade.

    Use a switch statement in your code.

    A+ A A- B+ B B- C Else
    5.0 5.0 4.5 4.0 3.5 3.0 2.5 0

    Follow the sample output given below.

    >_ java GradeHelper B CAP for grade B is 3.5

    You can assume that the input is always in the correct format i.e., no need to handle invalid input cases.

    Hint




    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/controlFlow/branching/index.page-vue-render.js b/book/cppToJava/controlFlow/branching/index.page-vue-render.js index 47aebac8db..ff8e716240 100644 --- a/book/cppToJava/controlFlow/branching/index.page-vue-render.js +++ b/book/cppToJava/controlFlow/branching/index.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{stat with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_v("Oracle's tutorials on ["),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/if.html"}},[_v("if-else")]),_v("]["),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html"}},[_v("switch")]),_v("]")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/controlFlow/index.html b/book/cppToJava/controlFlow/index.html index 3b3f9dca56..ea578d174c 100644 --- a/book/cppToJava/controlFlow/index.html +++ b/book/cppToJava/controlFlow/index.html @@ -1144,7 +1144,7 @@ -

    Hint




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/controlFlow/index.page-vue-render.js b/book/cppToJava/controlFlow/index.page-vue-render.js index 71a73725b0..1062c88af5 100644 --- a/book/cppToJava/controlFlow/index.page-vue-render.js +++ b/book/cppToJava/controlFlow/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"control-flow"}},[_c('span',[_v("Control flow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#control-flow","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/controlFlow/loops/index.html b/book/cppToJava/controlFlow/loops/index.html index 082ae959c5..efc6b254ab 100644 --- a/book/cppToJava/controlFlow/loops/index.html +++ b/book/cppToJava/controlFlow/loops/index.html @@ -529,7 +529,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/controlFlow/loops/index.page-vue-render.js b/book/cppToJava/controlFlow/loops/index.page-vue-render.js index b7becce7da..eabb30ddb1 100644 --- a/book/cppToJava/controlFlow/loops/index.page-vue-render.js +++ b/book/cppToJava/controlFlow/loops/index.page-vue-render.js @@ -107,6 +107,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/controlFlow/methods/index.html b/book/cppToJava/controlFlow/methods/index.html index 6beb1a5c00..6eb5076b42 100644 --- a/book/cppToJava/controlFlow/methods/index.html +++ b/book/cppToJava/controlFlow/methods/index.html @@ -353,7 +353,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/controlFlow/methods/index.page-vue-render.js b/book/cppToJava/controlFlow/methods/index.page-vue-render.js index 0a3f7766ae..d31d3fc4ef 100644 --- a/book/cppToJava/controlFlow/methods/index.page-vue-render.js +++ b/book/cppToJava/controlFlow/methods/index.page-vue-render.js @@ -80,6 +80,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/dataTypes/arrays/index.html b/book/cppToJava/dataTypes/arrays/index.html index 91b5f3e2db..35fca2c031 100644 --- a/book/cppToJava/dataTypes/arrays/index.html +++ b/book/cppToJava/dataTypes/arrays/index.html @@ -452,7 +452,7 @@ -

    Hint


    partial solution



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint


    partial solution



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/dataTypes/arrays/index.page-vue-render.js b/book/cppToJava/dataTypes/arrays/index.page-vue-render.js index 6f6637f5ae..3b9ec040b9 100644 --- a/book/cppToJava/dataTypes/arrays/index.page-vue-render.js +++ b/book/cppToJava/dataTypes/arrays/index.page-vue-render.js @@ -77,6 +77,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/dataTypes/index.html b/book/cppToJava/dataTypes/index.html index ecaa9aba8e..ecc8e5a2fc 100644 --- a/book/cppToJava/dataTypes/index.html +++ b/book/cppToJava/dataTypes/index.html @@ -687,7 +687,7 @@ -

    Hint


    partial solution




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint


    partial solution




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/dataTypes/index.page-vue-render.js b/book/cppToJava/dataTypes/index.page-vue-render.js index 0253c74538..2689c1f823 100644 --- a/book/cppToJava/dataTypes/index.page-vue-render.js +++ b/book/cppToJava/dataTypes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"data-types"}},[_c('span',[_v("Data types")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#data-types","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/dataTypes/operators/index.html b/book/cppToJava/dataTypes/operators/index.html index bdb2e64845..d8225d2145 100644 --- a/book/cppToJava/dataTypes/operators/index.html +++ b/book/cppToJava/dataTypes/operators/index.html @@ -88,7 +88,7 @@ -

    When an expression has multiple operators, normal operator precedence rules apply. Furthermore, you can use parentheses to specify a precise precedence.

    Examples:

    • 4 * 5 - 1 19 (* has higher precedence than -)
    • 4 * (5 - 1) 16 (parentheses ( ) have higher precedence than *)

    Java does not allow .

    The unary operators require only one operand; they perform various operations such as incrementing/decrementing a value by one, negating an expression, or inverting the value of a boolean.-- Java Tutorial

    Operator Description -- Java Tutorial example
    + Unary plus operator; indicates positive value
    (numbers are positive without this, however)
    x = 5; y = +x y is 5
    - Unary minus operator; negates an expression x = 5; y = -x y is -5
    ++ Increment operator; increments a value by 1 i = 5; i++ i is 6
    -- Decrement operator; decrements a value by 1 i = 5; i-- i is 4
    ! Logical complement operator; inverts the value of a boolean foo = true; bar = !foo bar is false

    Relational operators are used to check conditions like whether two values are equal, or whether one is greater than the other. The following expressions show how they are used:

    Operator Description example true example false
    x == y x is equal to y 5 == 5 5 == 6
    x != y x is not equal to y 5 != 6 5 != 5
    x > y x is greater than y 7 > 6 5 > 6
    x < y x is less than y 5 < 6 7 < 6
    x >= y x is greater than or equal to y 5 >= 5 4 >= 5
    x <= y x is less than or equal to y 4 <= 5 6 <= 5

    The result of a relational operator is a boolean value.

    Java has three conditional operators that are used to operate on boolean values.

    Operator Description example true example false
    && and true && true true true && false false
    || or true || false true false || false false
    ! not not false not true

    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When an expression has multiple operators, normal operator precedence rules apply. Furthermore, you can use parentheses to specify a precise precedence.

    Examples:

    • 4 * 5 - 1 19 (* has higher precedence than -)
    • 4 * (5 - 1) 16 (parentheses ( ) have higher precedence than *)

    Java does not allow .

    The unary operators require only one operand; they perform various operations such as incrementing/decrementing a value by one, negating an expression, or inverting the value of a boolean.-- Java Tutorial

    Operator Description -- Java Tutorial example
    + Unary plus operator; indicates positive value
    (numbers are positive without this, however)
    x = 5; y = +x y is 5
    - Unary minus operator; negates an expression x = 5; y = -x y is -5
    ++ Increment operator; increments a value by 1 i = 5; i++ i is 6
    -- Decrement operator; decrements a value by 1 i = 5; i-- i is 4
    ! Logical complement operator; inverts the value of a boolean foo = true; bar = !foo bar is false

    Relational operators are used to check conditions like whether two values are equal, or whether one is greater than the other. The following expressions show how they are used:

    Operator Description example true example false
    x == y x is equal to y 5 == 5 5 == 6
    x != y x is not equal to y 5 != 6 5 != 5
    x > y x is greater than y 7 > 6 5 > 6
    x < y x is less than y 5 < 6 7 < 6
    x >= y x is greater than or equal to y 5 >= 5 4 >= 5
    x <= y x is less than or equal to y 4 <= 5 6 <= 5

    The result of a relational operator is a boolean value.

    Java has three conditional operators that are used to operate on boolean values.

    Operator Description example true example false
    && and true && true true true && false false
    || or true || false true false || false false
    ! not not false not true

    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/dataTypes/operators/index.page-vue-render.js b/book/cppToJava/dataTypes/operators/index.page-vue-render.js index 8619970c36..291fdf2fac 100644 --- a/book/cppToJava/dataTypes/operators/index.page-vue-render.js +++ b/book/cppToJava/dataTypes/operators/index.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('div',{staticClass:"table-responsive"},[_c('table',{staticC with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_v("Oracle's tutorial on operators: "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html"}},[_v("part 1")]),_v(", "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html"}},[_v("part 2")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.tutorialspoint.com/java/java_basic_operators.htm"}},[_v("A tutorial on operators")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("by tutorialspoint.com")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/dataTypes/primitiveTypes/index.html b/book/cppToJava/dataTypes/primitiveTypes/index.html index 5623e29337..9b84ea7815 100644 --- a/book/cppToJava/dataTypes/primitiveTypes/index.html +++ b/book/cppToJava/dataTypes/primitiveTypes/index.html @@ -13,7 +13,7 @@

    Can use primitive data types

    C++ to Java → Data Types → -

    Primitive data types

    Java has a number of primitive data types, as given below:

    • byte: an integer in the range -128 to 127 (inclusive).
    • short: an integer in the range -32,768 to 32,767 (inclusive).
    • int: an integer in the range -231 to 231-1.
    • long: An integer in the range -263 to 263-1.
    • float: a single-precision 32-bit IEEE 754 floating point. This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead.
    • double: a double-precision 64-bit IEEE 754 floating point. For decimal values, this data type is generally the default choice. This data type should never be used for precise values, such as currency.
    • boolean: has only two possible values: true and false.
    • char: The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive).
    The String type (a peek)

    Java has a built-in type called String to represent strings. While String is not a primitive type, strings are used often. String values are demarcated by enclosing in a pair of double quotes (e.g., "Hello"). You can use the + operator to concatenate strings (e.g., "Hello " + "!").

    You’ll learn more about strings in a later section.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Primitive data types

    Java has a number of primitive data types, as given below:

    • byte: an integer in the range -128 to 127 (inclusive).
    • short: an integer in the range -32,768 to 32,767 (inclusive).
    • int: an integer in the range -231 to 231-1.
    • long: An integer in the range -263 to 263-1.
    • float: a single-precision 32-bit IEEE 754 floating point. This data type should never be used for precise values, such as currency. For that, you will need to use the java.math.BigDecimal class instead.
    • double: a double-precision 64-bit IEEE 754 floating point. For decimal values, this data type is generally the default choice. This data type should never be used for precise values, such as currency.
    • boolean: has only two possible values: true and false.
    • char: The char data type is a single 16-bit Unicode character. It has a minimum value of '\u0000' (or 0) and a maximum value of '\uffff' (or 65,535 inclusive).
    The String type (a peek)

    Java has a built-in type called String to represent strings. While String is not a primitive type, strings are used often. String values are demarcated by enclosing in a pair of double quotes (e.g., "Hello"). You can use the + operator to concatenate strings (e.g., "Hello " + "!").

    You’ll learn more about strings in a later section.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/dataTypes/primitiveTypes/index.page-vue-render.js b/book/cppToJava/dataTypes/primitiveTypes/index.page-vue-render.js index 3e116abae4..a2ba14d053 100644 --- a/book/cppToJava/dataTypes/primitiveTypes/index.page-vue-render.js +++ b/book/cppToJava/dataTypes/primitiveTypes/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can use primitive data types")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → Data Types →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"primitive-data-types"}},[_c('span',[_v("Primitive data types")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#primitive-data-types","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Java has a number of "),_c('em',[_v("primitive")]),_v(" data types")]),_v(", as given below:")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("byte")])]),_v(": an integer in the range -128 to 127 (inclusive).")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("short")])]),_v(": an integer in the range -32,768 to 32,767 (inclusive).")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")])]),_v(": an integer in the range -2"),_c('sup',[_v("31")]),_v(" to 2"),_c('sup',[_v("31")]),_v("-1.")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("long")])]),_v(": An integer in the range -2"),_c('sup',[_v("63")]),_v(" to 2"),_c('sup',[_v("63")]),_v("-1.")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("float")])]),_v(": a single-precision 32-bit IEEE 754 floating point. This data type should never be used for precise values, such as currency. For that, you will need to use the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/math/BigDecimal.html"}},[_v("java.math.BigDecimal")]),_v(" class instead.")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("double")])]),_v(": a double-precision 64-bit IEEE 754 floating point. For decimal values, this data type is generally the default choice. This data type should never be used for precise values, such as currency.")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("boolean")])]),_v(": has only two possible values: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("true")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("false")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("char")])]),_v(": The char data type is a single 16-bit Unicode character. It has a minimum value of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("'\\u0000'")]),_v(" (or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(") and a maximum value of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("'\\uffff'")]),_v(" (or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("65,535")]),_v(" inclusive).")])]),_v(" "),_c('h6',{attrs:{"id":"the-string-type-a-peek"}},[_v("The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("String")]),_v(" type (a peek)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#the-string-type-a-peek","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{staticClass:"badge rounded-pill bg-danger"},[_c('span',[_c('span',{staticClass:"fas fa-not-equal",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('strong',[_v("Java has a built-in type called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("String")]),_v(" to represent strings. While "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("String")]),_v(" is not a primitive type, strings are used often.")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("String")]),_v(" values are demarcated by enclosing in a pair of double quotes (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\"Hello\"")]),_v("). You can use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("+")]),_v(" operator to concatenate strings (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\"Hello \" + \"!\"")]),_v(").")]),_v(" "),_c('p',[_v("You’ll learn more about strings in a later section.")])]),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html"}},[_v("Oracle's tutorial on primitive data types")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://beginnersbook.com/2017/08/data-types-in-java/"}},[_v("A tutorial on primitive data types")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("by beginnersbook.com")])])])])])])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/dataTypes/variables/index.html b/book/cppToJava/dataTypes/variables/index.html index 5f97025050..dce465815d 100644 --- a/book/cppToJava/dataTypes/variables/index.html +++ b/book/cppToJava/dataTypes/variables/index.html @@ -173,7 +173,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/dataTypes/variables/index.page-vue-render.js b/book/cppToJava/dataTypes/variables/index.page-vue-render.js index c231a48ef4..9a7143bc00 100644 --- a/book/cppToJava/dataTypes/variables/index.page-vue-render.js +++ b/book/cppToJava/dataTypes/variables/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}}, with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html"}},[_v("Oracle's tutorial on variables")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.tutorialspoint.com/java/java_variable_types.htm"}},[_v("A tutorial on variables")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("by tutorialspoint.com")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/exceptions/how/index.html b/book/cppToJava/exceptions/how/index.html index af16f20428..0a6708f9da 100644 --- a/book/cppToJava/exceptions/how/index.html +++ b/book/cppToJava/exceptions/how/index.html @@ -449,7 +449,7 @@ -

    Partial solution



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Partial solution



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/exceptions/how/index.page-vue-render.js b/book/cppToJava/exceptions/how/index.page-vue-render.js index 41cb8a0b3b..5cdc339f3c 100644 --- a/book/cppToJava/exceptions/how/index.page-vue-render.js +++ b/book/cppToJava/exceptions/how/index.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/exceptions/index.html b/book/cppToJava/exceptions/index.html index 97169b791e..d5bb5d18a3 100644 --- a/book/cppToJava/exceptions/index.html +++ b/book/cppToJava/exceptions/index.html @@ -449,7 +449,7 @@ -

    Partial solution




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Partial solution




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/exceptions/index.page-vue-render.js b/book/cppToJava/exceptions/index.page-vue-render.js index b8924f1e00..ae54592e05 100644 --- a/book/cppToJava/exceptions/index.page-vue-render.js +++ b/book/cppToJava/exceptions/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"exceptions"}},[_c('span',[_v("Exceptions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exceptions","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/exceptions/what/index.html b/book/cppToJava/exceptions/what/index.html index 7fadbf6de6..04859ecca0 100644 --- a/book/cppToJava/exceptions/what/index.html +++ b/book/cppToJava/exceptions/what/index.html @@ -13,7 +13,7 @@

    Can explain Java Exceptions

    C++ to Java → Exceptions → -

    What are Exceptions?

    Given below is an extract from the -- Java Tutorial, with some adaptations.

    There are three basic categories of exceptions In Java:

    • Checked exceptions: exceptional conditions that a well-written application should anticipate and recover from. All exceptions are checked exceptions, except for Error, RuntimeException, and their subclasses.

    Suppose an application prompts a user for an input file name, then opens the file by passing the name to the constructor for java.io.FileReader. Normally, the user provides the name of an existing, readable file, so the construction of the FileReader object succeeds, and the execution of the application proceeds normally. But sometimes the user supplies the name of a nonexistent file, and the constructor throws java.io.FileNotFoundException. A well-written program will catch this exception and notify the user of the mistake, possibly prompting for a corrected file name.

    • Errors: exceptional conditions that are external to the application, and that the application usually cannot anticipate or recover from. Errors are those exceptions indicated by Error and its subclasses.

    Suppose that an application successfully opens a file for input, but is unable to read the file because of a hardware or system malfunction. The unsuccessful read will throw java.io.IOError. An application might choose to catch this exception, in order to notify the user of the problem — but it also might make sense for the program to print a stack trace and exit.

    • Runtime exceptions: conditions that are internal to the application, and that the application usually cannot anticipate or recover from. Runtime exceptions are those indicated by RuntimeException and its subclasses. These usually indicate programming bugs, such as logic errors or improper use of an API.

    Consider the application described previously that passes a file name to the constructor for FileReader. If a logic error causes a null to be passed to the constructor, the constructor will throw NullPointerException. The application can catch this exception, but it probably makes more sense to eliminate the bug that caused the exception to occur.

    Errors and runtime exceptions are collectively known as unchecked exceptions.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What are Exceptions?

    Given below is an extract from the -- Java Tutorial, with some adaptations.

    There are three basic categories of exceptions In Java:

    • Checked exceptions: exceptional conditions that a well-written application should anticipate and recover from. All exceptions are checked exceptions, except for Error, RuntimeException, and their subclasses.

    Suppose an application prompts a user for an input file name, then opens the file by passing the name to the constructor for java.io.FileReader. Normally, the user provides the name of an existing, readable file, so the construction of the FileReader object succeeds, and the execution of the application proceeds normally. But sometimes the user supplies the name of a nonexistent file, and the constructor throws java.io.FileNotFoundException. A well-written program will catch this exception and notify the user of the mistake, possibly prompting for a corrected file name.

    • Errors: exceptional conditions that are external to the application, and that the application usually cannot anticipate or recover from. Errors are those exceptions indicated by Error and its subclasses.

    Suppose that an application successfully opens a file for input, but is unable to read the file because of a hardware or system malfunction. The unsuccessful read will throw java.io.IOError. An application might choose to catch this exception, in order to notify the user of the problem — but it also might make sense for the program to print a stack trace and exit.

    • Runtime exceptions: conditions that are internal to the application, and that the application usually cannot anticipate or recover from. Runtime exceptions are those indicated by RuntimeException and its subclasses. These usually indicate programming bugs, such as logic errors or improper use of an API.

    Consider the application described previously that passes a file name to the constructor for FileReader. If a logic error causes a null to be passed to the constructor, the constructor will throw NullPointerException. The application can catch this exception, but it probably makes more sense to eliminate the bug that caused the exception to occur.

    Errors and runtime exceptions are collectively known as unchecked exceptions.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/exceptions/what/index.page-vue-render.js b/book/cppToJava/exceptions/what/index.page-vue-render.js index b078b12c6c..97555ec3a9 100644 --- a/book/cppToJava/exceptions/what/index.page-vue-render.js +++ b/book/cppToJava/exceptions/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_c('mark',[_c('em',[_v("Runtime with(this){return _c('p',[_c('strong',[_v("Errors and runtime exceptions are collectively known as "),_c('mark',[_c('em',[_v("unchecked")]),_v(" exceptions")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/generics/how/index.html b/book/cppToJava/generics/how/index.html index 1c77d845fa..62bdc8991d 100644 --- a/book/cppToJava/generics/how/index.html +++ b/book/cppToJava/generics/how/index.html @@ -341,7 +341,7 @@ -

    The code, new OrderedPair<String, Integer>, instantiates K as a String and V as an Integer. Therefore, the parameter types of OrderedPair's constructor are String and Integer, respectively.

    A type variable can be any non-primitive type you specify: any class type, any interface type, any array type, or even another type variable.

    By convention, type parameter names are single, uppercase letters. The most commonly used type parameter names are:

    • E - Element (used extensively by the Java Collections Framework)
    • K - Key
    • N - Number
    • T - Type
    • V - Value
    • S, U, V etc. - 2nd, 3rd, 4th types
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The code, new OrderedPair<String, Integer>, instantiates K as a String and V as an Integer. Therefore, the parameter types of OrderedPair's constructor are String and Integer, respectively.

    A type variable can be any non-primitive type you specify: any class type, any interface type, any array type, or even another type variable.

    By convention, type parameter names are single, uppercase letters. The most commonly used type parameter names are:

    • E - Element (used extensively by the Java Collections Framework)
    • K - Key
    • N - Number
    • T - Type
    • V - Value
    • S, U, V etc. - 2nd, 3rd, 4th types
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/generics/how/index.page-vue-render.js b/book/cppToJava/generics/how/index.page-vue-render.js index ad1837112e..f93012bf75 100644 --- a/book/cppToJava/generics/how/index.page-vue-render.js +++ b/book/cppToJava/generics/how/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_c('strong',[_v("By convention, type parameter names a with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("E")]),_v(" - Element (used extensively by the Java Collections Framework)")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("K")]),_v(" - Key")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("N")]),_v(" - Number")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("T")]),_v(" - Type")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("V")]),_v(" - Value")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("S")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("U")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("V")]),_v(" etc. - 2nd, 3rd, 4th types")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/generics/index.html b/book/cppToJava/generics/index.html index c3dbf3e93a..45df7a9b00 100644 --- a/book/cppToJava/generics/index.html +++ b/book/cppToJava/generics/index.html @@ -476,7 +476,7 @@ -

    The code, new OrderedPair<String, Integer>, instantiates K as a String and V as an Integer. Therefore, the parameter types of OrderedPair's constructor are String and Integer, respectively.

    A type variable can be any non-primitive type you specify: any class type, any interface type, any array type, or even another type variable.

    By convention, type parameter names are single, uppercase letters. The most commonly used type parameter names are:

    • E - Element (used extensively by the Java Collections Framework)
    • K - Key
    • N - Number
    • T - Type
    • V - Value
    • S, U, V etc. - 2nd, 3rd, 4th types

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The code, new OrderedPair<String, Integer>, instantiates K as a String and V as an Integer. Therefore, the parameter types of OrderedPair's constructor are String and Integer, respectively.

    A type variable can be any non-primitive type you specify: any class type, any interface type, any array type, or even another type variable.

    By convention, type parameter names are single, uppercase letters. The most commonly used type parameter names are:

    • E - Element (used extensively by the Java Collections Framework)
    • K - Key
    • N - Number
    • T - Type
    • V - Value
    • S, U, V etc. - 2nd, 3rd, 4th types

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/generics/index.page-vue-render.js b/book/cppToJava/generics/index.page-vue-render.js index 155da4254d..67f42b4d0e 100644 --- a/book/cppToJava/generics/index.page-vue-render.js +++ b/book/cppToJava/generics/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"generics"}},[_c('span',[_v("Generics")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#generics","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/generics/what/index.html b/book/cppToJava/generics/what/index.html index d47d1d0cbd..187d75c5c8 100644 --- a/book/cppToJava/generics/what/index.html +++ b/book/cppToJava/generics/what/index.html @@ -148,7 +148,7 @@ -

    The problem with this solution is, since its methods accept or return an Object, you are free to pass in whatever you want, provided that it is not one of the primitive types. There is no way to verify, at compile time, how the class is used. One part of the code may place an Integer in the box and expect to get Integers out of it, while another part of the code may mistakenly pass in a String, resulting in a runtime error.

    Generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. Much like the more familiar , type parameters provide a way for you to re-use the same code with different inputs. The difference is that the inputs to formal parameters are values, while the inputs to type parameters are types.

    A generic Box class allows you to define what type of elements will be put in the Box. For example, you can instantiate a Box object to keep Integer elements so that any attempt to put a non-Integer object in that Box object will result in a compile error.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The problem with this solution is, since its methods accept or return an Object, you are free to pass in whatever you want, provided that it is not one of the primitive types. There is no way to verify, at compile time, how the class is used. One part of the code may place an Integer in the box and expect to get Integers out of it, while another part of the code may mistakenly pass in a String, resulting in a runtime error.

    Generics enable types (classes and interfaces) to be parameters when defining classes, interfaces and methods. Much like the more familiar , type parameters provide a way for you to re-use the same code with different inputs. The difference is that the inputs to formal parameters are values, while the inputs to type parameters are types.

    A generic Box class allows you to define what type of elements will be put in the Box. For example, you can instantiate a Box object to keep Integer elements so that any attempt to put a non-Integer object in that Box object will result in a compile error.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/generics/what/index.page-vue-render.js b/book/cppToJava/generics/what/index.page-vue-render.js index 015e31ff15..f94989e16f 100644 --- a/book/cppToJava/generics/what/index.page-vue-render.js +++ b/book/cppToJava/generics/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_v("Given below is an extract from the "),_c('small',[ with(this){return _c('p',[_c('strong',[_v("You can use polymorphism to write code that can work with multiple types, but that approach has some shortcomings.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/gettingStarted/compiling/index.html b/book/cppToJava/gettingStarted/compiling/index.html index 804a1b7070..5b93e6c779 100644 --- a/book/cppToJava/gettingStarted/compiling/index.html +++ b/book/cppToJava/gettingStarted/compiling/index.html @@ -13,7 +13,7 @@

    Can compile a simple Java program

    C++ to Java → Getting Started → -

    Compiling a program

    To compile the HelloWorld program, open a command console, navigate to the folder containing the file, and run the following command.

    >_ javac HelloWorld.java

    If the compilation is successful, you should see a file HelloWorld.class. That file contains the byte code for your program. If the compilation is unsuccessful, you will be notified of the compile-time errors.

    Notes:

    • javac is the java compiler that you get when you install the JDK.
    • For the above command to work, your console program should be able to find the javac executable (e.g., In Windows, the location of the javac.exe should be in the PATH system variable).
      This page shows how to set PATH in different OS'es.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Compiling a program

    To compile the HelloWorld program, open a command console, navigate to the folder containing the file, and run the following command.

    >_ javac HelloWorld.java

    If the compilation is successful, you should see a file HelloWorld.class. That file contains the byte code for your program. If the compilation is unsuccessful, you will be notified of the compile-time errors.

    Notes:

    • javac is the java compiler that you get when you install the JDK.
    • For the above command to work, your console program should be able to find the javac executable (e.g., In Windows, the location of the javac.exe should be in the PATH system variable).
      This page shows how to set PATH in different OS'es.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/gettingStarted/compiling/index.page-vue-render.js b/book/cppToJava/gettingStarted/compiling/index.page-vue-render.js index c976128a8d..33f4b5295a 100644 --- a/book/cppToJava/gettingStarted/compiling/index.page-vue-render.js +++ b/book/cppToJava/gettingStarted/compiling/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('small',[_c('span',{staticClass:"badge bg-secondary with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("javac")]),_v(" is the java compiler that you get when you install the JDK.")]),_v(" "),_c('li',[_v("For the above command to work, your console program should be able to find the javac executable (e.g., In Windows, the location of the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("javac.exe")]),_v(" should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("PATH")]),_v(" system variable)."),_c('br'),_v(" "),_c('a',{attrs:{"href":"https://www.java.com/en/download/help/path.xml"}},[_v("This page")]),_v(" shows how to set PATH in different OS'es.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/gettingStarted/helloWorld/index.html b/book/cppToJava/gettingStarted/helloWorld/index.html index 767d02c07c..81b4ea2b77 100644 --- a/book/cppToJava/gettingStarted/helloWorld/index.html +++ b/book/cppToJava/gettingStarted/helloWorld/index.html @@ -98,7 +98,7 @@ -

    This HelloWorld Java program defines one method named main: public static void main(String[] args)

    System.out.println() displays a given text on the screen.

    Some similarities:

    • Java programs consists of statements, grouped , which are then grouped into classes.
    • Java is “case-sensitive”, which means SYSTEM is different from System.
    • public is an access modifier that indicates the method is accessible from outside this class. Similarly, private access modifier indicates that a method/attribute is not accessible outside the class.
    • static indicates this method is defined as a class-level member. Do not worry if you don’t know what that means. It will be explained later.
    • void indicates that the method does not return anything.
    • The name and format of the main method is special as it is the method that Java executes when you run a Java program.
    • A class is a collection of methods. This program defines a class named HelloWorld.
    • Java uses squiggly braces ({ and }) to group things together.
    • The line starting with // is a comment. You can use // for single line comments and /* ... */ for multi-line comments in Java code.

    Some differences:

    • Java use the term method instead of function. In particular, Java doesn’t have stand-alone functions. Every method should belong to a class. The main method will not work unless it is inside the HelloWorld class.
    • A Java class definition does not end with a semicolon, but most Java statements do.
    • In most cases (i.e., there are exceptions), the name of the class has to match the name of the file it is in, so this class has to be in a file named HelloWorld.java.
    • There is no need for the HelloWorld code to have something like #include <iostream>. The library files needed by the HelloWorld code is available by default without having to "include" them explicitly.
    • There is no need to return 0 at the end of the main method to indicate the execution was successful. It is considered as a successful execution unless an error is signalled specifically.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    This HelloWorld Java program defines one method named main: public static void main(String[] args)

    System.out.println() displays a given text on the screen.

    Some similarities:

    • Java programs consists of statements, grouped , which are then grouped into classes.
    • Java is “case-sensitive”, which means SYSTEM is different from System.
    • public is an access modifier that indicates the method is accessible from outside this class. Similarly, private access modifier indicates that a method/attribute is not accessible outside the class.
    • static indicates this method is defined as a class-level member. Do not worry if you don’t know what that means. It will be explained later.
    • void indicates that the method does not return anything.
    • The name and format of the main method is special as it is the method that Java executes when you run a Java program.
    • A class is a collection of methods. This program defines a class named HelloWorld.
    • Java uses squiggly braces ({ and }) to group things together.
    • The line starting with // is a comment. You can use // for single line comments and /* ... */ for multi-line comments in Java code.

    Some differences:

    • Java use the term method instead of function. In particular, Java doesn’t have stand-alone functions. Every method should belong to a class. The main method will not work unless it is inside the HelloWorld class.
    • A Java class definition does not end with a semicolon, but most Java statements do.
    • In most cases (i.e., there are exceptions), the name of the class has to match the name of the file it is in, so this class has to be in a file named HelloWorld.java.
    • There is no need for the HelloWorld code to have something like #include <iostream>. The library files needed by the HelloWorld code is available by default without having to "include" them explicitly.
    • There is no need to return 0 at the end of the main method to indicate the execution was successful. It is considered as a successful execution unless an error is signalled specifically.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/gettingStarted/helloWorld/index.page-vue-render.js b/book/cppToJava/gettingStarted/helloWorld/index.page-vue-render.js index 782a4aab2e..ccae29e452 100644 --- a/book/cppToJava/gettingStarted/helloWorld/index.page-vue-render.js +++ b/book/cppToJava/gettingStarted/helloWorld/index.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{ with(this){return _c('ul',[_c('li',[_v("Java use the term "),_c('em',[_v("method")]),_v(" instead of "),_c('em',[_v("function")]),_v(". In particular, Java doesn’t have stand-alone functions. Every method should belong to a class. The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("main")]),_v(" method will not work unless it is inside the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("HelloWorld")]),_v(" class.")]),_v(" "),_c('li',[_v("A Java class definition does not end with a semicolon, but most Java statements do.")]),_v(" "),_c('li',[_v("In "),_c('em',[_v("most")]),_v(" cases (i.e., there are exceptions), the name of the class has to match the name of the file it is in, so this class has to be in a file named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("HelloWorld.java")]),_v(".")]),_v(" "),_c('li',[_v("There is no need for the HelloWorld code to have something like "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("#include ")]),_v(". The library files needed by the HelloWorld code is available by default without having to \"include\" them explicitly.")]),_v(" "),_c('li',[_v("There is no need to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("return 0")]),_v(" at the end of the main method to indicate the execution was successful. It is considered as a successful execution unless an error is signalled specifically.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/gettingStarted/index.html b/book/cppToJava/gettingStarted/index.html index 4895678244..11007730dc 100644 --- a/book/cppToJava/gettingStarted/index.html +++ b/book/cppToJava/gettingStarted/index.html @@ -404,7 +404,7 @@ -


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/gettingStarted/index.page-vue-render.js b/book/cppToJava/gettingStarted/index.page-vue-render.js index 4b85a53a20..775f3f002d 100644 --- a/book/cppToJava/gettingStarted/index.page-vue-render.js +++ b/book/cppToJava/gettingStarted/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"getting-started"}},[_c('span',[_v("Getting started")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#getting-started","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/gettingStarted/installation/index.html b/book/cppToJava/gettingStarted/installation/index.html index f13dfd5d9f..cb75a7ddfc 100644 --- a/book/cppToJava/gettingStarted/installation/index.html +++ b/book/cppToJava/gettingStarted/installation/index.html @@ -13,7 +13,7 @@ +

    Installation

    To run Java programs, you only need to have a recent version of the Java Runtime Environment (JRE) installed in your device.

    If you want to develop applications for Java, download and install a recent version of the Java Development Kit (JDK), which includes the JRE as well as additional resources needed to develop Java applications.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/gettingStarted/installation/index.page-vue-render.js b/book/cppToJava/gettingStarted/installation/index.page-vue-render.js index 53a696d9af..022e262c48 100644 --- a/book/cppToJava/gettingStarted/installation/index.page-vue-render.js +++ b/book/cppToJava/gettingStarted/installation/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can install Java")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → Getting Started →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"installation"}},[_c('span',[_v("Installation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#installation","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("To "),_c('em',[_v("run")]),_v(" Java programs, you only need to have a recent version of the "),_c('em',[_v("Java Runtime Environment ("),_c('mark',[_v("JRE")]),_v(")")]),_v(" installed in your device.")]),_v(" "),_c('p',[_v("If you want "),_c('strong',[_v("to "),_c('em',[_v("develop")]),_v(" applications for Java, download and install a recent version of the "),_c('em',[_v("Java Development Kit ("),_c('mark',[_v("JDK")]),_v(")")])]),_v(", which includes the JRE as well as additional resources needed to develop Java applications.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/gettingStarted/running/index.html b/book/cppToJava/gettingStarted/running/index.html index a0b6066983..d9f9c86a19 100644 --- a/book/cppToJava/gettingStarted/running/index.html +++ b/book/cppToJava/gettingStarted/running/index.html @@ -319,7 +319,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/gettingStarted/running/index.page-vue-render.js b/book/cppToJava/gettingStarted/running/index.page-vue-render.js index 897f9efd38..4edfac04c7 100644 --- a/book/cppToJava/gettingStarted/running/index.page-vue-render.js +++ b/book/cppToJava/gettingStarted/running/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('ul',[_c('li',[_v("IntelliJ IDEA")]),_v(" "),_c('li',[_v("E with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/index.html b/book/cppToJava/index.html index 0d7f6c464c..120f205a76 100644 --- a/book/cppToJava/index.html +++ b/book/cppToJava/index.html @@ -10474,7 +10474,7 @@ -

    Resources:


    Streams: Basic

    Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds




    JavaFX

    Can use JavaFX to build a simple GUI

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:


    Streams: Basic

    Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds




    JavaFX

    Can use JavaFX to build a simple GUI

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/index.page-vue-render.js b/book/cppToJava/index.page-vue-render.js index 3a19b69c51..b788824252 100644 --- a/book/cppToJava/index.page-vue-render.js +++ b/book/cppToJava/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"c-to-java"}},[_c('span',[_v("C++ to Java")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#c-to-java","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/inheritance/abstractClassesAndMethods/index.html b/book/cppToJava/inheritance/abstractClassesAndMethods/index.html index 49d0729b8e..1a6130f3a1 100644 --- a/book/cppToJava/inheritance/abstractClassesAndMethods/index.html +++ b/book/cppToJava/inheritance/abstractClassesAndMethods/index.html @@ -390,7 +390,7 @@ -

    Add the missing Shape class as an abstract class with two abstract methods.

    Partial solution



    Statements about abstract classes


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Add the missing Shape class as an abstract class with two abstract methods.

    Partial solution



    Statements about abstract classes


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/inheritance/abstractClassesAndMethods/index.page-vue-render.js b/book/cppToJava/inheritance/abstractClassesAndMethods/index.page-vue-render.js index b24b86db1c..91851b068c 100644 --- a/book/cppToJava/inheritance/abstractClassesAndMethods/index.page-vue-render.js +++ b/book/cppToJava/inheritance/abstractClassesAndMethods/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/inheritance/basic/index.html b/book/cppToJava/inheritance/basic/index.html index de710ccc38..7a0c09423a 100644 --- a/book/cppToJava/inheritance/basic/index.html +++ b/book/cppToJava/inheritance/basic/index.html @@ -439,7 +439,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/inheritance/basic/index.page-vue-render.js b/book/cppToJava/inheritance/basic/index.page-vue-render.js index f3e9151ea8..fc353a834c 100644 --- a/book/cppToJava/inheritance/basic/index.page-vue-render.js +++ b/book/cppToJava/inheritance/basic/index.page-vue-render.js @@ -68,6 +68,6 @@ with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.tutorials with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/inheritance/index.html b/book/cppToJava/inheritance/index.html index 6afcf02229..22e38425a6 100644 --- a/book/cppToJava/inheritance/index.html +++ b/book/cppToJava/inheritance/index.html @@ -2285,7 +2285,7 @@ -

    Partial solution




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Partial solution




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/inheritance/index.page-vue-render.js b/book/cppToJava/inheritance/index.page-vue-render.js index f467ed9606..b1c2a26cf2 100644 --- a/book/cppToJava/inheritance/index.page-vue-render.js +++ b/book/cppToJava/inheritance/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"inheritance"}},[_c('span',[_v("Inheritance")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#inheritance","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/inheritance/interfaces/index.html b/book/cppToJava/inheritance/interfaces/index.html index a971602e35..58d70247c4 100644 --- a/book/cppToJava/inheritance/interfaces/index.html +++ b/book/cppToJava/inheritance/interfaces/index.html @@ -461,7 +461,7 @@ -

    Partial solution



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Partial solution



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/inheritance/interfaces/index.page-vue-render.js b/book/cppToJava/inheritance/interfaces/index.page-vue-render.js index 291d388b02..9e74921c89 100644 --- a/book/cppToJava/inheritance/interfaces/index.page-vue-render.js +++ b/book/cppToJava/inheritance/interfaces/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/inheritance/objectClass/index.html b/book/cppToJava/inheritance/objectClass/index.html index 4241af69ed..1b923fd7ee 100644 --- a/book/cppToJava/inheritance/objectClass/index.html +++ b/book/cppToJava/inheritance/objectClass/index.html @@ -591,7 +591,7 @@ -

    You can use the super.toString from the subclass to invoke the behavior of the method you are overriding. This is useful here because the overriding method is simply adding onto the behavior of the overridden method.

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    You can use the super.toString from the subclass to invoke the behavior of the method you are overriding. This is useful here because the overriding method is simply adding onto the behavior of the overridden method.

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/inheritance/objectClass/index.page-vue-render.js b/book/cppToJava/inheritance/objectClass/index.page-vue-render.js index 4266d09de1..f6458845fb 100644 --- a/book/cppToJava/inheritance/objectClass/index.page-vue-render.js +++ b/book/cppToJava/inheritance/objectClass/index.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('p',[_v("By default, the "),_c('code',{pre:true,attrs:{"cla with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/inheritance/polymorphism/index.html b/book/cppToJava/inheritance/polymorphism/index.html index aeb7ec5fb9..ab99e2b476 100644 --- a/book/cppToJava/inheritance/polymorphism/index.html +++ b/book/cppToJava/inheritance/polymorphism/index.html @@ -456,7 +456,7 @@ -

    You may use an array of size 100 to store the shapes.

    Partial solution


    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    You may use an array of size 100 to store the shapes.

    Partial solution


    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/inheritance/polymorphism/index.page-vue-render.js b/book/cppToJava/inheritance/polymorphism/index.page-vue-render.js index c83fec2e60..7b45e75e0c 100644 --- a/book/cppToJava/inheritance/polymorphism/index.page-vue-render.js +++ b/book/cppToJava/inheritance/polymorphism/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/javaWorld/editions/index.html b/book/cppToJava/javaWorld/editions/index.html index ffe0d3bca8..00dd5559a7 100644 --- a/book/cppToJava/javaWorld/editions/index.html +++ b/book/cppToJava/javaWorld/editions/index.html @@ -13,7 +13,7 @@

    Can explain Java editions

    C++ to Java → The Java World → -

    Java editions

    According to the Official Java documentation, there are four platforms of the Java programming language:

    • Java Platform, Standard Edition (Java SE): Contains the core functionality of the Java programming language.

    • Java Platform, Enterprise Edition (Java EE): For developing and running large-scale enterprise applications. Built on top of Java SE.

    • Java Platform, Micro Edition (Java ME): For Java programming language applications meant for small devices, like mobile phones. A subset of Java SE.

    • JavaFX: For creating applications with graphical user interfaces. Can work with the other three above.

    This book chapter uses the Java SE edition unless stated otherwise.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Java editions

    According to the Official Java documentation, there are four platforms of the Java programming language:

    • Java Platform, Standard Edition (Java SE): Contains the core functionality of the Java programming language.

    • Java Platform, Enterprise Edition (Java EE): For developing and running large-scale enterprise applications. Built on top of Java SE.

    • Java Platform, Micro Edition (Java ME): For Java programming language applications meant for small devices, like mobile phones. A subset of Java SE.

    • JavaFX: For creating applications with graphical user interfaces. Can work with the other three above.

    This book chapter uses the Java SE edition unless stated otherwise.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/javaWorld/editions/index.page-vue-render.js b/book/cppToJava/javaWorld/editions/index.page-vue-render.js index b3d31a11e0..9543aa9dcd 100644 --- a/book/cppToJava/javaWorld/editions/index.page-vue-render.js +++ b/book/cppToJava/javaWorld/editions/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain Java editions")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → The Java World →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"java-editions"}},[_c('span',[_v("Java editions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#java-editions","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("According to the "),_c('a',{attrs:{"href":"https://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html"}},[_v("Official Java documentation")]),_v(", there are four platforms of the Java programming language:")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Java Platform, Standard Edition (Java SE)")]),_v(": Contains the core functionality of the Java programming language.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Java Platform, Enterprise Edition (Java EE)")]),_v(": For developing and running large-scale enterprise applications. Built on top of Java SE.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Java Platform, Micro Edition (Java ME)")]),_v(": For Java programming language applications meant for small devices, like mobile phones. A subset of Java SE.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("JavaFX")]),_v(": For creating applications with graphical user interfaces. Can work with the other three above.")])])]),_v(" "),_c('p',[_v("This book chapter uses the Java SE edition unless stated otherwise.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/javaWorld/how/index.html b/book/cppToJava/javaWorld/how/index.html index df0733b278..648c6fdf00 100644 --- a/book/cppToJava/javaWorld/how/index.html +++ b/book/cppToJava/javaWorld/how/index.html @@ -13,7 +13,7 @@

    Can explain how Java works at a higher-level

    C++ to Java → The Java World → -

    How Java works

    Java is both and . Instead of translating programs directly into machine language, the Java compiler generates byte code. Byte code is portable, so it is possible to compile a Java program on one machine, transfer the byte code to another machine, and run the byte code on the other machine. That’s why Java is considered a platform independent technology, aka WORA (Write Once Run Anywhere). The interpreter that runs byte code is called a “Java Virtual Machine” (JVM).

    Java technology is both a programming language and a platform. The Java programming language is a high-level object-oriented language that has a particular syntax and style. A Java platform is a particular environment in which Java programming language applications run. --Oracle

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How Java works

    Java is both and . Instead of translating programs directly into machine language, the Java compiler generates byte code. Byte code is portable, so it is possible to compile a Java program on one machine, transfer the byte code to another machine, and run the byte code on the other machine. That’s why Java is considered a platform independent technology, aka WORA (Write Once Run Anywhere). The interpreter that runs byte code is called a “Java Virtual Machine” (JVM).

    Java technology is both a programming language and a platform. The Java programming language is a high-level object-oriented language that has a particular syntax and style. A Java platform is a particular environment in which Java programming language applications run. --Oracle

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/javaWorld/how/index.page-vue-render.js b/book/cppToJava/javaWorld/how/index.page-vue-render.js index d938d6855e..eb3c9ce4b2 100644 --- a/book/cppToJava/javaWorld/how/index.page-vue-render.js +++ b/book/cppToJava/javaWorld/how/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"how-java-works"}},[_c('span',[ with(this){return _c('blockquote',[_c('p',[_c('strong',[_v("Java technology is both a "),_c('em',[_v("programming language")]),_v(" and a "),_c('em',[_v("platform")]),_v(".")]),_v(" The Java programming language is a high-level object-oriented language that has a particular syntax and style. A Java platform is a particular environment in which Java programming language applications run. "),_c('small',[_v("--"),_c('a',{attrs:{"href":"https://docs.oracle.com/javaee/6/firstcup/doc/gkhoy.html"}},[_v("Oracle")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/javaWorld/index.html b/book/cppToJava/javaWorld/index.html index 5d21ed1e69..4da06a5a03 100644 --- a/book/cppToJava/javaWorld/index.html +++ b/book/cppToJava/javaWorld/index.html @@ -14,7 +14,7 @@

    C++ to Java →

    The Java world

    What is Java?

    Can explain what Java is

    Java was conceived by James Gosling and his team at Sun Microsystems in 1991.

    Java is directly related to both C and C++. Java inherits its syntax from C. Its object model is adapted from C++. ---Java: A Beginner’s Guide, by Oracle

    Fun fact: The language was initially called Oak after an oak tree that stood outside Gosling's office. Later the project went by the name Green and was finally renamed Java, from Java coffee. --Wikipedia

    Oracle became the owner of Java in 2010, when it acquired Sun Microsystems.

    Java has remained the most popular language in the world for several years now (as at July 2018), according to the TIOBE index.


    How Java works

    Can explain how Java works at a higher-level

    Java is both and . Instead of translating programs directly into machine language, the Java compiler generates byte code. Byte code is portable, so it is possible to compile a Java program on one machine, transfer the byte code to another machine, and run the byte code on the other machine. That’s why Java is considered a platform independent technology, aka WORA (Write Once Run Anywhere). The interpreter that runs byte code is called a “Java Virtual Machine” (JVM).

    Java technology is both a programming language and a platform. The Java programming language is a high-level object-oriented language that has a particular syntax and style. A Java platform is a particular environment in which Java programming language applications run. --Oracle


    Java editions

    Can explain Java editions

    According to the Official Java documentation, there are four platforms of the Java programming language:

    • Java Platform, Standard Edition (Java SE): Contains the core functionality of the Java programming language.

    • Java Platform, Enterprise Edition (Java EE): For developing and running large-scale enterprise applications. Built on top of Java SE.

    • Java Platform, Micro Edition (Java ME): For Java programming language applications meant for small devices, like mobile phones. A subset of Java SE.

    • JavaFX: For creating applications with graphical user interfaces. Can work with the other three above.

    This book chapter uses the Java SE edition unless stated otherwise.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--Java: A Beginner’s Guide, by Oracle

    Fun fact: The language was initially called Oak after an oak tree that stood outside Gosling's office. Later the project went by the name Green and was finally renamed Java, from Java coffee. --Wikipedia

    Oracle became the owner of Java in 2010, when it acquired Sun Microsystems.

    Java has remained the most popular language in the world for several years now (as at July 2018), according to the TIOBE index.


    How Java works

    Can explain how Java works at a higher-level

    Java is both and . Instead of translating programs directly into machine language, the Java compiler generates byte code. Byte code is portable, so it is possible to compile a Java program on one machine, transfer the byte code to another machine, and run the byte code on the other machine. That’s why Java is considered a platform independent technology, aka WORA (Write Once Run Anywhere). The interpreter that runs byte code is called a “Java Virtual Machine” (JVM).

    Java technology is both a programming language and a platform. The Java programming language is a high-level object-oriented language that has a particular syntax and style. A Java platform is a particular environment in which Java programming language applications run. --Oracle


    Java editions

    Can explain Java editions

    According to the Official Java documentation, there are four platforms of the Java programming language:

    • Java Platform, Standard Edition (Java SE): Contains the core functionality of the Java programming language.

    • Java Platform, Enterprise Edition (Java EE): For developing and running large-scale enterprise applications. Built on top of Java SE.

    • Java Platform, Micro Edition (Java ME): For Java programming language applications meant for small devices, like mobile phones. A subset of Java SE.

    • JavaFX: For creating applications with graphical user interfaces. Can work with the other three above.

    This book chapter uses the Java SE edition unless stated otherwise.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/javaWorld/index.page-vue-render.js b/book/cppToJava/javaWorld/index.page-vue-render.js index 1f8b9c2250..5997e61a51 100644 --- a/book/cppToJava/javaWorld/index.page-vue-render.js +++ b/book/cppToJava/javaWorld/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"the-java-world"}},[_c('span',[_v("The Java world")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#the-java-world","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/javaWorld/what/index.html b/book/cppToJava/javaWorld/what/index.html index 88c6e931bc..ba2c267bf7 100644 --- a/book/cppToJava/javaWorld/what/index.html +++ b/book/cppToJava/javaWorld/what/index.html @@ -14,7 +14,7 @@

    Can explain what Java is

    C++ to Java → The Java World →

    What is Java?

    Java was conceived by James Gosling and his team at Sun Microsystems in 1991.

    Java is directly related to both C and C++. Java inherits its syntax from C. Its object model is adapted from C++. ---Java: A Beginner’s Guide, by Oracle

    Fun fact: The language was initially called Oak after an oak tree that stood outside Gosling's office. Later the project went by the name Green and was finally renamed Java, from Java coffee. --Wikipedia

    Oracle became the owner of Java in 2010, when it acquired Sun Microsystems.

    Java has remained the most popular language in the world for several years now (as at July 2018), according to the TIOBE index.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--Java: A Beginner’s Guide, by Oracle

    Fun fact: The language was initially called Oak after an oak tree that stood outside Gosling's office. Later the project went by the name Green and was finally renamed Java, from Java coffee. --Wikipedia

    Oracle became the owner of Java in 2010, when it acquired Sun Microsystems.

    Java has remained the most popular language in the world for several years now (as at July 2018), according to the TIOBE index.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/javaWorld/what/index.page-vue-render.js b/book/cppToJava/javaWorld/what/index.page-vue-render.js index 81d46ee248..d3c9f486e0 100644 --- a/book/cppToJava/javaWorld/what/index.page-vue-render.js +++ b/book/cppToJava/javaWorld/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Oracle became the owner of Java in 20 with(this){return _c('p',[_v("Java has remained the "),_c('strong',[_v("most popular language in the world")]),_v(" for several years now (as at July 2018), according to the "),_c('a',{attrs:{"href":"https://www.tiobe.com/tiobe-index/"}},[_v("TIOBE index")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/junit/basic/index.html b/book/cppToJava/junit/basic/index.html index 2a3d665080..32d65ed665 100644 --- a/book/cppToJava/junit/basic/index.html +++ b/book/cppToJava/junit/basic/index.html @@ -147,7 +147,7 @@ e.g., intDivision_zeroDivisor_exceptionThrown
  • There are several ways to verify the code throws the correct exception. The second test method in the example above shows one of the simpler methods. If the exception is thrown, it will be caught and further verified inside the catch block. But if it is not thrown as expected, the test will reach fail() line and will fail as a result.
  • What to test for when writing tests? While test case design techniques is a separate topic altogether, it should be noted that the goal of these tests is to catch bugs in the code. Therefore, test using inputs that can trigger a potentially buggy path in the code. Another way to approach this is, to write tests such that if a future developer modified the method to unintentionally introduce a bug into it, at least one of the test should fail (thus alerting that developer to the mistake immediately).

    In the example above, the IntPairTest class tests the IntPair#intDivision(int, int) method using several inputs, some even seemingly attempting to 'trick' the method into producing a wrong result. If the method still produces the correct output for such 'tricky' inputs (as well as 'normal' outputs), we can have a higher confidence on the method being correctly implemented.
    However, also note that the current test cases do not (but probably should) test for the inputs (0, 0), to confirm that it throws the expected exception.


    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +[ long answer ]
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/junit/basic/index.page-vue-render.js b/book/cppToJava/junit/basic/index.page-vue-render.js index f88012269e..3b11b325c8 100644 --- a/book/cppToJava/junit/basic/index.page-vue-render.js +++ b/book/cppToJava/junit/basic/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("What to test for when writing tests?" with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Recommended:")]),_v(" "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/junit.html"}},[_v("JUnit tutorial @se-edu/guides")]),_v(" explains how to use JUnit in your Java project.")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/"}},[_v("JUnit Official User Guide")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://devqa.io/junit-5-annotations/"}},[_v("JUnit 5 Tutorial – Common Annotations With Examples")]),_v(" - a short tutorial")]),_v(" "),_c('li',[_v("How to test private methods in Java?\n[ "),_c('a',{attrs:{"href":"http://stackoverflow.com/questions/34571/whats-the-proper-way-to-test-a-class-with-private-methods-using-junit"}},[_v("short answer")]),_v(" ]\n[ "),_c('a',{attrs:{"href":"http://www.artima.com/suiterunner/private.html"}},[_v("long answer")]),_v(" ]")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/junit/index.html b/book/cppToJava/junit/index.html index b3d8561925..22eb1986fb 100644 --- a/book/cppToJava/junit/index.html +++ b/book/cppToJava/junit/index.html @@ -147,7 +147,7 @@ e.g., intDivision_zeroDivisor_exceptionThrown
  • There are several ways to verify the code throws the correct exception. The second test method in the example above shows one of the simpler methods. If the exception is thrown, it will be caught and further verified inside the catch block. But if it is not thrown as expected, the test will reach fail() line and will fail as a result.
  • What to test for when writing tests? While test case design techniques is a separate topic altogether, it should be noted that the goal of these tests is to catch bugs in the code. Therefore, test using inputs that can trigger a potentially buggy path in the code. Another way to approach this is, to write tests such that if a future developer modified the method to unintentionally introduce a bug into it, at least one of the test should fail (thus alerting that developer to the mistake immediately).

    In the example above, the IntPairTest class tests the IntPair#intDivision(int, int) method using several inputs, some even seemingly attempting to 'trick' the method into producing a wrong result. If the method still produces the correct output for such 'tricky' inputs (as well as 'normal' outputs), we can have a higher confidence on the method being correctly implemented.
    However, also note that the current test cases do not (but probably should) test for the inputs (0, 0), to confirm that it throws the expected exception.


    Resources:

    JUnit: Intermediate

    Can use intermediate features of JUnit

    Given below are some noteworthy JUnit concepts, as per the JUnit 5 User Guide.

    • Annotations: In addition to the @Test annotation you've seen already, there are many other annotations in JUnit. For example, the @Disabled annotation can be used to disable a test temporarily. [more ...]

    • Pre/post-test tasks: In order to allow individual test methods to be executed in isolation and to avoid unexpected side effects due to mutable test instance state, JUnit creates a new instance of each test class before executing each test method. It is possible to supply code that should be run before/after every test method/class (e.g., for setting up the environment required by the tests, or cleaning up things after a test is completed) by using test instance lifecycle annotations such as @BeforeEach @AfterAll. [more ...]

    • Conditional test execution: It is possible to configure tests to run only under certain conditions. For example, @TestOnMac annotation can be used to specify tests that should run on Mac OS only. [more ...]

    • Assumptions: It is possible to specify assumptions that must hold for a test to be executed (i.e., the test will be skipped if the assumption does not hold). [more ...]

    • Tagging tests: It is possible to tag tests (e.g., @Tag("slow") so that tests can be selected based on tags. [more ...]

    • Test execution order: By default, JUnit executes test classes and methods in a deterministic but intentionally nonobvious order. This ensures that subsequent runs of a test suite execute tests in the same order, thereby allowing for repeatable builds. But it is possible to specify a specific testing order. [more ...]

    • Test hierarchies: Normally, we organize tests into separate test classes. If a more hierarchical structure is needed, the @Nested annotation can be used to express the relationship among groups of tests. [more ...]

    • Repeated tests: JUnit provides the ability to repeat a test a specified number of times by annotating a method with @RepeatedTest and specifying the total number of repetitions desired. [more ...]

    • Parameterized tests make it possible to run a test multiple times with different arguments. The parameter values can be supplied using a variety of ways e.g., an array of values, enums, a csv file, etc. [more ...]

    • Dynamic tests: The @TestFactory annotation can be used to specify factory methods that generate tests dynamically. [more ...]

    • Timeouts: The @Timeout annotation allows one to declare that a test should fail if its execution time exceeds a given duration. [more ...]

    • Parallel execution: By default, JUnit tests are run sequentially in a single thread. Running tests in parallel — for example, to speed up execution — is available as an opt-in feature. [more ...]

    • Extensions: JUnit supports third-party extensions. The built-in TempDirectory extension is used to create and clean up a temporary directory for an individual test or all tests in a test class. [more ...]


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +[ long answer ]

    JUnit: Intermediate

    Can use intermediate features of JUnit

    Given below are some noteworthy JUnit concepts, as per the JUnit 5 User Guide.

    • Annotations: In addition to the @Test annotation you've seen already, there are many other annotations in JUnit. For example, the @Disabled annotation can be used to disable a test temporarily. [more ...]

    • Pre/post-test tasks: In order to allow individual test methods to be executed in isolation and to avoid unexpected side effects due to mutable test instance state, JUnit creates a new instance of each test class before executing each test method. It is possible to supply code that should be run before/after every test method/class (e.g., for setting up the environment required by the tests, or cleaning up things after a test is completed) by using test instance lifecycle annotations such as @BeforeEach @AfterAll. [more ...]

    • Conditional test execution: It is possible to configure tests to run only under certain conditions. For example, @TestOnMac annotation can be used to specify tests that should run on Mac OS only. [more ...]

    • Assumptions: It is possible to specify assumptions that must hold for a test to be executed (i.e., the test will be skipped if the assumption does not hold). [more ...]

    • Tagging tests: It is possible to tag tests (e.g., @Tag("slow") so that tests can be selected based on tags. [more ...]

    • Test execution order: By default, JUnit executes test classes and methods in a deterministic but intentionally nonobvious order. This ensures that subsequent runs of a test suite execute tests in the same order, thereby allowing for repeatable builds. But it is possible to specify a specific testing order. [more ...]

    • Test hierarchies: Normally, we organize tests into separate test classes. If a more hierarchical structure is needed, the @Nested annotation can be used to express the relationship among groups of tests. [more ...]

    • Repeated tests: JUnit provides the ability to repeat a test a specified number of times by annotating a method with @RepeatedTest and specifying the total number of repetitions desired. [more ...]

    • Parameterized tests make it possible to run a test multiple times with different arguments. The parameter values can be supplied using a variety of ways e.g., an array of values, enums, a csv file, etc. [more ...]

    • Dynamic tests: The @TestFactory annotation can be used to specify factory methods that generate tests dynamically. [more ...]

    • Timeouts: The @Timeout annotation allows one to declare that a test should fail if its execution time exceeds a given duration. [more ...]

    • Parallel execution: By default, JUnit tests are run sequentially in a single thread. Running tests in parallel — for example, to speed up execution — is available as an opt-in feature. [more ...]

    • Extensions: JUnit supports third-party extensions. The built-in TempDirectory extension is used to create and clean up a temporary directory for an individual test or all tests in a test class. [more ...]


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/junit/index.page-vue-render.js b/book/cppToJava/junit/index.page-vue-render.js index 2bcfb03338..9990d00148 100644 --- a/book/cppToJava/junit/index.page-vue-render.js +++ b/book/cppToJava/junit/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"junit"}},[_c('span',[_v("JUnit")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#junit","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/junit/intermediate/index.html b/book/cppToJava/junit/intermediate/index.html index 4ac2271777..6f554d053b 100644 --- a/book/cppToJava/junit/intermediate/index.html +++ b/book/cppToJava/junit/intermediate/index.html @@ -13,7 +13,7 @@

    Can use intermediate features of JUnit

    C++ to Java → JUnit → -

    JUnit: Intermediate

    Given below are some noteworthy JUnit concepts, as per the JUnit 5 User Guide.

    • Annotations: In addition to the @Test annotation you've seen already, there are many other annotations in JUnit. For example, the @Disabled annotation can be used to disable a test temporarily. [more ...]

    • Pre/post-test tasks: In order to allow individual test methods to be executed in isolation and to avoid unexpected side effects due to mutable test instance state, JUnit creates a new instance of each test class before executing each test method. It is possible to supply code that should be run before/after every test method/class (e.g., for setting up the environment required by the tests, or cleaning up things after a test is completed) by using test instance lifecycle annotations such as @BeforeEach @AfterAll. [more ...]

    • Conditional test execution: It is possible to configure tests to run only under certain conditions. For example, @TestOnMac annotation can be used to specify tests that should run on Mac OS only. [more ...]

    • Assumptions: It is possible to specify assumptions that must hold for a test to be executed (i.e., the test will be skipped if the assumption does not hold). [more ...]

    • Tagging tests: It is possible to tag tests (e.g., @Tag("slow") so that tests can be selected based on tags. [more ...]

    • Test execution order: By default, JUnit executes test classes and methods in a deterministic but intentionally nonobvious order. This ensures that subsequent runs of a test suite execute tests in the same order, thereby allowing for repeatable builds. But it is possible to specify a specific testing order. [more ...]

    • Test hierarchies: Normally, we organize tests into separate test classes. If a more hierarchical structure is needed, the @Nested annotation can be used to express the relationship among groups of tests. [more ...]

    • Repeated tests: JUnit provides the ability to repeat a test a specified number of times by annotating a method with @RepeatedTest and specifying the total number of repetitions desired. [more ...]

    • Parameterized tests make it possible to run a test multiple times with different arguments. The parameter values can be supplied using a variety of ways e.g., an array of values, enums, a csv file, etc. [more ...]

    • Dynamic tests: The @TestFactory annotation can be used to specify factory methods that generate tests dynamically. [more ...]

    • Timeouts: The @Timeout annotation allows one to declare that a test should fail if its execution time exceeds a given duration. [more ...]

    • Parallel execution: By default, JUnit tests are run sequentially in a single thread. Running tests in parallel — for example, to speed up execution — is available as an opt-in feature. [more ...]

    • Extensions: JUnit supports third-party extensions. The built-in TempDirectory extension is used to create and clean up a temporary directory for an individual test or all tests in a test class. [more ...]

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    JUnit: Intermediate

    Given below are some noteworthy JUnit concepts, as per the JUnit 5 User Guide.

    • Annotations: In addition to the @Test annotation you've seen already, there are many other annotations in JUnit. For example, the @Disabled annotation can be used to disable a test temporarily. [more ...]

    • Pre/post-test tasks: In order to allow individual test methods to be executed in isolation and to avoid unexpected side effects due to mutable test instance state, JUnit creates a new instance of each test class before executing each test method. It is possible to supply code that should be run before/after every test method/class (e.g., for setting up the environment required by the tests, or cleaning up things after a test is completed) by using test instance lifecycle annotations such as @BeforeEach @AfterAll. [more ...]

    • Conditional test execution: It is possible to configure tests to run only under certain conditions. For example, @TestOnMac annotation can be used to specify tests that should run on Mac OS only. [more ...]

    • Assumptions: It is possible to specify assumptions that must hold for a test to be executed (i.e., the test will be skipped if the assumption does not hold). [more ...]

    • Tagging tests: It is possible to tag tests (e.g., @Tag("slow") so that tests can be selected based on tags. [more ...]

    • Test execution order: By default, JUnit executes test classes and methods in a deterministic but intentionally nonobvious order. This ensures that subsequent runs of a test suite execute tests in the same order, thereby allowing for repeatable builds. But it is possible to specify a specific testing order. [more ...]

    • Test hierarchies: Normally, we organize tests into separate test classes. If a more hierarchical structure is needed, the @Nested annotation can be used to express the relationship among groups of tests. [more ...]

    • Repeated tests: JUnit provides the ability to repeat a test a specified number of times by annotating a method with @RepeatedTest and specifying the total number of repetitions desired. [more ...]

    • Parameterized tests make it possible to run a test multiple times with different arguments. The parameter values can be supplied using a variety of ways e.g., an array of values, enums, a csv file, etc. [more ...]

    • Dynamic tests: The @TestFactory annotation can be used to specify factory methods that generate tests dynamically. [more ...]

    • Timeouts: The @Timeout annotation allows one to declare that a test should fail if its execution time exceeds a given duration. [more ...]

    • Parallel execution: By default, JUnit tests are run sequentially in a single thread. Running tests in parallel — for example, to speed up execution — is available as an opt-in feature. [more ...]

    • Extensions: JUnit supports third-party extensions. The built-in TempDirectory extension is used to create and clean up a temporary directory for an individual test or all tests in a test class. [more ...]

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/junit/intermediate/index.page-vue-render.js b/book/cppToJava/junit/intermediate/index.page-vue-render.js index b49b6f2a60..957f3fd821 100644 --- a/book/cppToJava/junit/intermediate/index.page-vue-render.js +++ b/book/cppToJava/junit/intermediate/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can use intermediate features of JUnit")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → JUnit →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"junit-intermediate"}},[_c('span',[_v("JUnit: Intermediate")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#junit-intermediate","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Given below are some noteworthy JUnit concepts, as per the "),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/"}},[_v("JUnit 5 User Guide")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotations:")]),_v(" In addition to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@Test")]),_v(" annotation you've seen already, there are many other annotations in JUnit. For example, the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@Disabled")]),_v(" annotation can be used to disable a test temporarily. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Pre/post-test tasks:")]),_v(" In order to allow individual test methods to be executed in isolation and to avoid unexpected side effects due to mutable test instance state, JUnit creates a new instance of each test class before executing each test method. It is possible to supply code that should be run before/after every test method/class (e.g., for setting up the environment required by the tests, or cleaning up things after a test is completed) by using "),_c('em',[_v("test instance lifecycle annotations")]),_v(" such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@BeforeEach")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@AfterAll")]),_v(". ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-instance-lifecycle"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Conditional test execution:")]),_v(" It is possible to configure tests to run only under certain conditions. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@TestOnMac")]),_v(" annotation can be used to specify tests that should run on Mac OS only. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-conditional-execution"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Assumptions:")]),_v(" It is possible to specify assumptions that must hold for a test to be executed (i.e., the test will be skipped if the assumption does not hold). ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-assumptions"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Tagging tests:")]),_v(" It is possible to tag tests (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@Tag(\"slow\")")]),_v(" so that tests can be selected based on tags. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-tagging-and-filtering"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Test execution order:")]),_v(" By default, JUnit executes test classes and methods in a "),_c('em',[_v("deterministic but intentionally nonobvious")]),_v(" order. This ensures that subsequent runs of a test suite execute tests in the same order, thereby allowing for repeatable builds. But it is possible to specify a specific testing order. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-test-execution-order"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Test hierarchies")]),_v(": Normally, we organize tests into separate test classes. If a more hierarchical structure is needed, the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@Nested")]),_v(" annotation can be used to express the relationship among groups of tests. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-nested"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Repeated tests:")]),_v(" JUnit provides the ability to repeat a test a specified number of times by annotating a method with "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@RepeatedTest")]),_v(" and specifying the total number of repetitions desired. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-repeated-tests"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Parameterized tests")]),_v(" make it possible to run a test multiple times with different arguments. The parameter values can be supplied using a variety of ways e.g., an array of values, enums, a csv file, etc. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Dynamic tests")]),_v(": The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@TestFactory")]),_v(" annotation can be used to specify factory methods that generate tests dynamically. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-dynamic-tests"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Timeouts:")]),_v(" The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@Timeout")]),_v(" annotation allows one to declare that a test should fail if its execution time exceeds a given duration. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-timeouts"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Parallel execution:")]),_v(" By default, JUnit tests are run sequentially in a single thread. Running tests in parallel — for example, to speed up execution — is available as an opt-in feature. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-parallel-execution"}},[_v("more ...")]),_v("]")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Extensions:")]),_v(" JUnit supports third-party extensions. The built-in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TempDirectory")]),_v(" extension is used to create and clean up a temporary directory for an individual test or all tests in a test class. ["),_c('a',{attrs:{"href":"https://junit.org/junit5/docs/current/user-guide/#writing-tests-built-in-extensions"}},[_v("more ...")]),_v("]")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/accessModifiers/index.html b/book/cppToJava/misc/accessModifiers/index.html index 74ef2e06e1..7eecc2ec9e 100644 --- a/book/cppToJava/misc/accessModifiers/index.html +++ b/book/cppToJava/misc/accessModifiers/index.html @@ -13,7 +13,7 @@

    Can explain access modifiers

    C++ to Java → Miscellaneous Topics → -

    Access modifiers

    Access level modifiers determine whether other classes can use a particular field or invoke a particular method.

    There are two levels of access control:

    1. At the class level:

      • public: the class is visible to all classes everywhere
      • no modifier (the default, also known as package-private): it is visible only within its own package

    2. At the member level:

      • public or no modifier (package-private): same meaning as when used with top-level classes
      • private: the member can only be accessed in its own class
      • protected: the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package

    The following table shows the access to members permitted by each modifier.

    Modifier
    public
    protected
    no modifier
    private

    Access levels affect you in two ways:

    1. When you use classes that come from another source, such as the classes in the Java platform, access levels determine which members of those classes your own classes can use.
    2. When you write a class, you need to decide what access level every member variable and every method in your class should have.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Access modifiers

    Access level modifiers determine whether other classes can use a particular field or invoke a particular method.

    There are two levels of access control:

    1. At the class level:

      • public: the class is visible to all classes everywhere
      • no modifier (the default, also known as package-private): it is visible only within its own package

    2. At the member level:

      • public or no modifier (package-private): same meaning as when used with top-level classes
      • private: the member can only be accessed in its own class
      • protected: the member can only be accessed within its own package (as with package-private) and, in addition, by a subclass of its class in another package

    The following table shows the access to members permitted by each modifier.

    Modifier
    public
    protected
    no modifier
    private

    Access levels affect you in two ways:

    1. When you use classes that come from another source, such as the classes in the Java platform, access levels determine which members of those classes your own classes can use.
    2. When you write a class, you need to decide what access level every member variable and every method in your class should have.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/accessModifiers/index.page-vue-render.js b/book/cppToJava/misc/accessModifiers/index.page-vue-render.js index bd01480c06..4113838ad7 100644 --- a/book/cppToJava/misc/accessModifiers/index.page-vue-render.js +++ b/book/cppToJava/misc/accessModifiers/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"clas with(this){return _c('ol',[_c('li',[_v("When you use classes that come from another source, such as the classes in the Java platform, access levels determine which members of those classes your own classes can use.")]),_v(" "),_c('li',[_v("When you write a class, you need to decide what access level every member variable and every method in your class should have.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/casting/index.html b/book/cppToJava/misc/casting/index.html index b71d0ba231..5bb351b2be 100644 --- a/book/cppToJava/misc/casting/index.html +++ b/book/cppToJava/misc/casting/index.html @@ -424,7 +424,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/casting/index.page-vue-render.js b/book/cppToJava/misc/casting/index.page-vue-render.js index e97ba93fa5..26c103d888 100644 --- a/book/cppToJava/misc/casting/index.page-vue-render.js +++ b/book/cppToJava/misc/casting/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Casting to an incompatible type can r with(this){return _c('p',[_v("You can use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("instanceof")]),_v(" operator to check if a cast is safe to perform.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/constants/index.html b/book/cppToJava/misc/constants/index.html index 4d608bae7c..8b9efe1e8f 100644 --- a/book/cppToJava/misc/constants/index.html +++ b/book/cppToJava/misc/constants/index.html @@ -53,7 +53,7 @@ -

    Math.PI is an example constant that comes with Java.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Math.PI is an example constant that comes with Java.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/constants/index.page-vue-render.js b/book/cppToJava/misc/constants/index.page-vue-render.js index b763ca8c0a..e4362e7204 100644 --- a/book/cppToJava/misc/constants/index.page-vue-render.js +++ b/book/cppToJava/misc/constants/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"constants"}},[_c('span',[_v("C with(this){return _c('p',[_v("Java does not directly support constants. The convention is to use a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("static")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("final")]),_v(" variable where a constant is needed. The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("static")]),_v(" modifier causes the variable to be available without instantiating an object. The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("final")]),_v(" modifier causes the variable to be unchangeable. Java constants are normally declared in ALL CAPS separated by underscores.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/enums/index.html b/book/cppToJava/misc/enums/index.html index 9c48f2e5d4..d12efd4662 100644 --- a/book/cppToJava/misc/enums/index.html +++ b/book/cppToJava/misc/enums/index.html @@ -183,7 +183,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/enums/index.page-vue-render.js b/book/cppToJava/misc/enums/index.page-vue-render.js index ffdede60f1..25912b7dbb 100644 --- a/book/cppToJava/misc/enums/index.page-vue-render.js +++ b/book/cppToJava/misc/enums/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_v("Note that while enumerations are usually a simple with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/fileAccess/index.html b/book/cppToJava/misc/fileAccess/index.html index 78f2accdac..259397c977 100644 --- a/book/cppToJava/misc/fileAccess/index.html +++ b/book/cppToJava/misc/fileAccess/index.html @@ -374,7 +374,7 @@ -

    The techniques above are good enough to manipulate simple text files. Note that it is also possible to perform file I/O operations using other classes.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The techniques above are good enough to manipulate simple text files. Note that it is also possible to perform file I/O operations using other classes.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/fileAccess/index.page-vue-render.js b/book/cppToJava/misc/fileAccess/index.page-vue-render.js index 4e6e92bfc0..591dbe66f7 100644 --- a/book/cppToJava/misc/fileAccess/index.page-vue-render.js +++ b/book/cppToJava/misc/fileAccess/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_c('strong',[_v("The "),_c('a',{attrs:{"href":"https:/ with(this){return _c('p',[_v("The techniques above are good enough to manipulate simple text files. Note that "),_c('strong',[_v("it is also possible to "),_c('a',{attrs:{"href":"https://www.tutorialspoint.com/java/java_files_io.htm"}},[_v("perform file I/O operations using other classes")])]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/index.html b/book/cppToJava/misc/index.html index 0dde1edb9d..c749a64993 100644 --- a/book/cppToJava/misc/index.html +++ b/book/cppToJava/misc/index.html @@ -1180,7 +1180,7 @@ -

    Resources:


    Streams: Basic

    Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds




    JavaFX

    Can use JavaFX to build a simple GUI

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:


    Streams: Basic

    Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds




    JavaFX

    Can use JavaFX to build a simple GUI

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/index.page-vue-render.js b/book/cppToJava/misc/index.page-vue-render.js index 357a4cf0f3..75c110c4ad 100644 --- a/book/cppToJava/misc/index.page-vue-render.js +++ b/book/cppToJava/misc/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"miscellaneous-topics"}},[_c('span',[_v("Miscellaneous topics")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#miscellaneous-topics","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/jar/index.html b/book/cppToJava/misc/jar/index.html index 5191c1797d..a475adcb88 100644 --- a/book/cppToJava/misc/jar/index.html +++ b/book/cppToJava/misc/jar/index.html @@ -15,7 +15,7 @@

    Can use JAR files

    C++ to Java → Miscellaneous Topics → -

    Using JAR files

    Java applications are typically delivered as JAR (short for Java Archive) files. A JAR contains Java classes and other resources (icons, media files, etc.).

    An executable JAR file can be launched using the java -jar command e.g., java -jar foo.jar launches the foo.jar file.

    The IDE or build tools such as Gradle can help you to package your application as a JAR file.

    See the tutorial Working with JAR files @se-edu/guides to learn how to create and use JAR files.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Using JAR files

    Java applications are typically delivered as JAR (short for Java Archive) files. A JAR contains Java classes and other resources (icons, media files, etc.).

    An executable JAR file can be launched using the java -jar command e.g., java -jar foo.jar launches the foo.jar file.

    The IDE or build tools such as Gradle can help you to package your application as a JAR file.

    See the tutorial Working with JAR files @se-edu/guides to learn how to create and use JAR files.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/jar/index.page-vue-render.js b/book/cppToJava/misc/jar/index.page-vue-render.js index c196191733..86ce10808c 100644 --- a/book/cppToJava/misc/jar/index.page-vue-render.js +++ b/book/cppToJava/misc/jar/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can use JAR files")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → Miscellaneous Topics →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"using-jar-files"}},[_c('span',[_v("Using JAR files")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#using-jar-files","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Java applications are typically delivered as JAR (short for "),_c('em',[_v("Java Archive")]),_v(") files.")]),_v(" A JAR contains Java classes and other resources (icons, media files, etc.).")]),_v(" "),_c('p',[_v("An executable JAR file can be launched using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar foo.jar")]),_v(" launches the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo.jar")]),_v(" file.")]),_v(" "),_c('p',[_v("The IDE or build tools such as Gradle can help you to package your application as a JAR file.")]),_v(" "),_c('p',[_v("See the tutorial "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/jar.html"}},[_c('em',[_v("Working with JAR files")]),_v(" @se-edu/guides")]),_v(" to learn how to create and use JAR files.")])]),_v(" "),_c('div')])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/javaFX/index.html b/book/cppToJava/misc/javaFX/index.html index 1af375ba27..8658f35c48 100644 --- a/book/cppToJava/misc/javaFX/index.html +++ b/book/cppToJava/misc/javaFX/index.html @@ -13,7 +13,7 @@ +

    JavaFX

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/javaFX/index.page-vue-render.js b/book/cppToJava/misc/javaFX/index.page-vue-render.js index 5cc5f0a627..86a6e667e9 100644 --- a/book/cppToJava/misc/javaFX/index.page-vue-render.js +++ b/book/cppToJava/misc/javaFX/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can use JavaFX to build a simple GUI")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → Miscellaneous Topics →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"javafx"}},[_c('span',[_v("JavaFX")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#javafx","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by "),_c('a',{attrs:{"href":"https://wiki.openjdk.java.net/display/OpenJFX"}},[_v("OpenJDK")]),_v(".")]),_v(" "),_c('p',[_v("Refer to the "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/javaFx.html"}},[_c('em',[_v("JavaFX tutorial")]),_v(" @SE-EDU/guides")]),_v(" to learn how to get started with JavaFX.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/javaFX/part01/index.html b/book/cppToJava/misc/javaFX/part01/index.html index 9d930ad023..e93d45dee7 100644 --- a/book/cppToJava/misc/javaFX/part01/index.html +++ b/book/cppToJava/misc/javaFX/part01/index.html @@ -198,7 +198,7 @@ -

    To solve this issue, open PersonOverview.fxml normally in IntelliJ and ensure that there is no such attribute around:

    fx:controller="seedu.address.view.PersonOverview"

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    To solve this issue, open PersonOverview.fxml normally in IntelliJ and ensure that there is no such attribute around:

    fx:controller="seedu.address.view.PersonOverview"

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/javaFX/part01/index.page-vue-render.js b/book/cppToJava/misc/javaFX/part01/index.page-vue-render.js index bd29fa2e90..dd76f78d3a 100644 --- a/book/cppToJava/misc/javaFX/part01/index.page-vue-render.js +++ b/book/cppToJava/misc/javaFX/part01/index.page-vue-render.js @@ -203,6 +203,6 @@ with(this){return _c('p',[_v("To solve this issue, open "),_c('code',{pre:true,a with(this){return _c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("fx:controller=\"seedu.address.view.PersonOverview\"")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/javaFX/part02/index.html b/book/cppToJava/misc/javaFX/part02/index.html index 4ff7b68ada..79cd8814c4 100644 --- a/book/cppToJava/misc/javaFX/part02/index.html +++ b/book/cppToJava/misc/javaFX/part02/index.html @@ -582,7 +582,7 @@ -

    Start the Application

    When you start your application now, you should see something like this:

    Congratulations! The application now shows the list of Persons in the view!

    You may notice that selecting a person in the TableView does nothing to the labels at the right side. That is because the user interaction portion has not been programmed yet, which we will cover in the next part of the tutorial.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Start the Application

    When you start your application now, you should see something like this:

    Congratulations! The application now shows the list of Persons in the view!

    You may notice that selecting a person in the TableView does nothing to the labels at the right side. That is because the user interaction portion has not been programmed yet, which we will cover in the next part of the tutorial.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/javaFX/part02/index.page-vue-render.js b/book/cppToJava/misc/javaFX/part02/index.page-vue-render.js index 7a237b62fe..2a7be99cfd 100644 --- a/book/cppToJava/misc/javaFX/part02/index.page-vue-render.js +++ b/book/cppToJava/misc/javaFX/part02/index.page-vue-render.js @@ -146,6 +146,6 @@ with(this){return _c('p',[_v("Congratulations! The application now shows the lis with(this){return _c('p',[_v("You may notice that selecting a person in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TableView")]),_v(" does nothing to the labels at the right side. That is because the user interaction portion has not been programmed yet, which we will cover in the next part of the tutorial.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/packages/index.html b/book/cppToJava/misc/packages/index.html index 20e0172434..610eb0c222 100644 --- a/book/cppToJava/misc/packages/index.html +++ b/book/cppToJava/misc/packages/index.html @@ -160,7 +160,7 @@ -

    Formatter class


    Note how the class can use PREFIX and format() (instead of Formatter.PREFIX and Formatter.format()).

    When using the commandline to compile/run Java, you should take the package into account.

    If the seedu.tojava.Main class is defined in the file Main.java,

    • when compiling from the <source folder>, the command is:
      javac seedu/tojava/Main.java
    • when running it from the <compiler output folder>, the command is:
      java seedu.tojava.Main

    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Formatter class


    Note how the class can use PREFIX and format() (instead of Formatter.PREFIX and Formatter.format()).

    When using the commandline to compile/run Java, you should take the package into account.

    If the seedu.tojava.Main class is defined in the file Main.java,

    • when compiling from the <source folder>, the command is:
      javac seedu/tojava/Main.java
    • when running it from the <compiler output folder>, the command is:
      java seedu.tojava.Main

    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/packages/index.page-vue-render.js b/book/cppToJava/misc/packages/index.page-vue-render.js index 5fb23b8ca6..9915b5348f 100644 --- a/book/cppToJava/misc/packages/index.page-vue-render.js +++ b/book/cppToJava/misc/packages/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_c('strong',[_v("When using the commandline to compile with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_v("Oracle's tutorial on packages: ["),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/concepts/package.html"}},[_v("What is a Package?")]),_v("] ["),_c('a',{attrs:{"href":"https://docs.oracle.com/javase/tutorial/java/package/index.html"}},[_v("Creating and Using Packages")]),_v("]")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/streams/index.html b/book/cppToJava/misc/streams/index.html index 0b858c2d30..e32a0e1d35 100644 --- a/book/cppToJava/misc/streams/index.html +++ b/book/cppToJava/misc/streams/index.html @@ -13,7 +13,7 @@

    Can use Java8 streams

    C++ to Java → Miscellaneous Topics → -

    Streams: Basic

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Streams: Basic

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/streams/index.page-vue-render.js b/book/cppToJava/misc/streams/index.page-vue-render.js index ee865a790b..bf1526d413 100644 --- a/book/cppToJava/misc/streams/index.page-vue-render.js +++ b/book/cppToJava/misc/streams/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{stat with(this){return _c('p',[_c('strong',[_v("Tutorials")]),_v(":")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/misc/varargs/index.html b/book/cppToJava/misc/varargs/index.html index b91da34188..63aa851815 100644 --- a/book/cppToJava/misc/varargs/index.html +++ b/book/cppToJava/misc/varargs/index.html @@ -51,7 +51,7 @@ -

    Resources:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/misc/varargs/index.page-vue-render.js b/book/cppToJava/misc/varargs/index.page-vue-render.js index fbd5e66124..7b7874dffe 100644 --- a/book/cppToJava/misc/varargs/index.page-vue-render.js +++ b/book/cppToJava/misc/varargs/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('span',[_c('span',{staticClass:"fas fa-paperclip",a with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html"}},[_v("Java Varargs feature (from Oracle.com)")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://www.javatpoint.com/varargs"}},[_v("Java Varargs tutorial (for javaTpoint.com)")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/objects/garbageCollection/index.html b/book/cppToJava/objects/garbageCollection/index.html index 63d33f4c6b..2bf9081bb2 100644 --- a/book/cppToJava/objects/garbageCollection/index.html +++ b/book/cppToJava/objects/garbageCollection/index.html @@ -50,7 +50,7 @@ -

    The first line creates a new Point object and makes spot refer to it. The second line changes spot so that instead of referring to the object, it refers to nothing. If there are no references to an object, there is no way to access its attributes or invoke a method on it. From the programmer’s view, it ceases to exist. However, it’s still present in the computer’s memory, taking up space.

    In Java, you don’t have to delete objects you create when they are no longer needed. As your program runs, the system automatically looks for stranded objects and reclaims them; then the space can be reused for new objects. This process is called garbage collection. You don’t have to do anything to make garbage collection happen, and in general don’t have to be aware of it. But in high-performance applications, you may notice a slight delay every now and then when Java reclaims space from discarded objects.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The first line creates a new Point object and makes spot refer to it. The second line changes spot so that instead of referring to the object, it refers to nothing. If there are no references to an object, there is no way to access its attributes or invoke a method on it. From the programmer’s view, it ceases to exist. However, it’s still present in the computer’s memory, taking up space.

    In Java, you don’t have to delete objects you create when they are no longer needed. As your program runs, the system automatically looks for stranded objects and reclaims them; then the space can be reused for new objects. This process is called garbage collection. You don’t have to do anything to make garbage collection happen, and in general don’t have to be aware of it. But in high-performance applications, you may notice a slight delay every now and then when Java reclaims space from discarded objects.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/objects/garbageCollection/index.page-vue-render.js b/book/cppToJava/objects/garbageCollection/index.page-vue-render.js index 327640b1ac..710ec66e18 100644 --- a/book/cppToJava/objects/garbageCollection/index.page-vue-render.js +++ b/book/cppToJava/objects/garbageCollection/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_v("The first line creates a new "),_c('code',{pre:tru with(this){return _c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{staticClass:"badge rounded-pill bg-danger"},[_c('span',[_c('span',{staticClass:"fas fa-not-equal",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('strong',[_v("In Java, you don’t have to delete objects you create when they are no longer needed.")]),_v(" As your program runs, the system automatically looks for stranded objects and reclaims them; then the space can be reused for new objects. This process is called "),_c('em',[_v("garbage collection")]),_v(". You don’t have to do anything to make garbage collection happen, and in general don’t have to be aware of it. But in high-performance applications, you may notice a slight delay every now and then when Java reclaims space from discarded objects.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/objects/index.html b/book/cppToJava/objects/index.html index 12fd4efcaa..3b055df0ce 100644 --- a/book/cppToJava/objects/index.html +++ b/book/cppToJava/objects/index.html @@ -1068,7 +1068,7 @@ -

    The first line creates a new Point object and makes spot refer to it. The second line changes spot so that instead of referring to the object, it refers to nothing. If there are no references to an object, there is no way to access its attributes or invoke a method on it. From the programmer’s view, it ceases to exist. However, it’s still present in the computer’s memory, taking up space.

    In Java, you don’t have to delete objects you create when they are no longer needed. As your program runs, the system automatically looks for stranded objects and reclaims them; then the space can be reused for new objects. This process is called garbage collection. You don’t have to do anything to make garbage collection happen, and in general don’t have to be aware of it. But in high-performance applications, you may notice a slight delay every now and then when Java reclaims space from discarded objects.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The first line creates a new Point object and makes spot refer to it. The second line changes spot so that instead of referring to the object, it refers to nothing. If there are no references to an object, there is no way to access its attributes or invoke a method on it. From the programmer’s view, it ceases to exist. However, it’s still present in the computer’s memory, taking up space.

    In Java, you don’t have to delete objects you create when they are no longer needed. As your program runs, the system automatically looks for stranded objects and reclaims them; then the space can be reused for new objects. This process is called garbage collection. You don’t have to do anything to make garbage collection happen, and in general don’t have to be aware of it. But in high-performance applications, you may notice a slight delay every now and then when Java reclaims space from discarded objects.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/objects/index.page-vue-render.js b/book/cppToJava/objects/index.page-vue-render.js index 5f26b22e02..0ca41f28ab 100644 --- a/book/cppToJava/objects/index.page-vue-render.js +++ b/book/cppToJava/objects/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"java-objects"}},[_c('span',[_v("Java objects")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#java-objects","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/objects/instanceMembers/index.html b/book/cppToJava/objects/instanceMembers/index.html index 90a788b0b4..c4a2de59e2 100644 --- a/book/cppToJava/objects/instanceMembers/index.html +++ b/book/cppToJava/objects/instanceMembers/index.html @@ -333,7 +333,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/objects/instanceMembers/index.page-vue-render.js b/book/cppToJava/objects/instanceMembers/index.page-vue-render.js index 1c87a08819..4703df0c8b 100644 --- a/book/cppToJava/objects/instanceMembers/index.page-vue-render.js +++ b/book/cppToJava/objects/instanceMembers/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/objects/passingObjects/index.html b/book/cppToJava/objects/passingObjects/index.html index 84c36c13db..09b8e71c8e 100644 --- a/book/cppToJava/objects/passingObjects/index.html +++ b/book/cppToJava/objects/passingObjects/index.html @@ -550,7 +550,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/objects/passingObjects/index.page-vue-render.js b/book/cppToJava/objects/passingObjects/index.page-vue-render.js index 2ea5e9719c..e836fa8f1c 100644 --- a/book/cppToJava/objects/passingObjects/index.page-vue-render.js +++ b/book/cppToJava/objects/passingObjects/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_c('span',{staticStyle:{"opacity":"0.5"}},[_c('span',{ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/objects/usingObjects/index.html b/book/cppToJava/objects/usingObjects/index.html index afdde67849..b892a9e18b 100644 --- a/book/cppToJava/objects/usingObjects/index.html +++ b/book/cppToJava/objects/usingObjects/index.html @@ -174,7 +174,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/objects/usingObjects/index.page-vue-render.js b/book/cppToJava/objects/usingObjects/index.page-vue-render.js index 808621a01b..7b81a75ac8 100644 --- a/book/cppToJava/objects/usingObjects/index.page-vue-render.js +++ b/book/cppToJava/objects/usingObjects/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_c('strong',[_v("To create a new object, you have to u with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/usefulClasses/api/index.html b/book/cppToJava/usefulClasses/api/index.html index a54a16bae4..b6ffcb91b4 100644 --- a/book/cppToJava/usefulClasses/api/index.html +++ b/book/cppToJava/usefulClasses/api/index.html @@ -13,7 +13,7 @@ +

    Java API

    Java comes with a rich collection of classes that you can use. They form what is known as the Java API (Application Programming Interface). Each class in the API comes with documentation in a standard format.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/usefulClasses/api/index.page-vue-render.js b/book/cppToJava/usefulClasses/api/index.page-vue-render.js index 5715b7702a..8ef337d36c 100644 --- a/book/cppToJava/usefulClasses/api/index.page-vue-render.js +++ b/book/cppToJava/usefulClasses/api/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can use Java API documentation about classes")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("C++ to Java → Some Useful Classes →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"java-api"}},[_c('span',[_v("Java API")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#java-api","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Java comes with a rich collection of classes that you can use. They form what is known as the Java API (Application Programming Interface). "),_c('strong',[_v("Each class in the API comes with documentation in a standard format.")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/index.html?overview-summary.html"}},[_v("List of all Java classes")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/javase/9/docs/api/java/lang/String.html"}},[_v("Example: API documentation of the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("String")]),_v(" class")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/usefulClasses/arraysClass/index.html b/book/cppToJava/usefulClasses/arraysClass/index.html index dd811ca935..b43eb5b52e 100644 --- a/book/cppToJava/usefulClasses/arraysClass/index.html +++ b/book/cppToJava/usefulClasses/arraysClass/index.html @@ -185,7 +185,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/usefulClasses/arraysClass/index.page-vue-render.js b/book/cppToJava/usefulClasses/arraysClass/index.page-vue-render.js index 1f77551a06..8295ee2ec7 100644 --- a/book/cppToJava/usefulClasses/arraysClass/index.page-vue-render.js +++ b/book/cppToJava/usefulClasses/arraysClass/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_c('a',{attrs:{"href":"https://docs.oracl with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/usefulClasses/index.html b/book/cppToJava/usefulClasses/index.html index 234c8b0fa6..a8a0164caf 100644 --- a/book/cppToJava/usefulClasses/index.html +++ b/book/cppToJava/usefulClasses/index.html @@ -1420,7 +1420,7 @@ -

    [hello, my, dear]

    Hint




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [hello, my, dear]

    Hint




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/usefulClasses/index.page-vue-render.js b/book/cppToJava/usefulClasses/index.page-vue-render.js index f0571ad61a..9b43cbd1b1 100644 --- a/book/cppToJava/usefulClasses/index.page-vue-render.js +++ b/book/cppToJava/usefulClasses/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"some-useful-classes"}},[_c('span',[_v("Some useful classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#some-useful-classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/usefulClasses/scannerClass/index.html b/book/cppToJava/usefulClasses/scannerClass/index.html index 64aa94de23..cf239a1675 100644 --- a/book/cppToJava/usefulClasses/scannerClass/index.html +++ b/book/cppToJava/usefulClasses/scannerClass/index.html @@ -311,7 +311,7 @@ -

    [hello, my, dear]

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [hello, my, dear]

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/usefulClasses/scannerClass/index.page-vue-render.js b/book/cppToJava/usefulClasses/scannerClass/index.page-vue-render.js index 14cad21c32..9b03c731bb 100644 --- a/book/cppToJava/usefulClasses/scannerClass/index.page-vue-render.js +++ b/book/cppToJava/usefulClasses/scannerClass/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/usefulClasses/stringClass/index.html b/book/cppToJava/usefulClasses/stringClass/index.html index f845ccab93..f799fe910c 100644 --- a/book/cppToJava/usefulClasses/stringClass/index.html +++ b/book/cppToJava/usefulClasses/stringClass/index.html @@ -718,7 +718,7 @@ -

    Hint



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Hint



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/usefulClasses/stringClass/index.page-vue-render.js b/book/cppToJava/usefulClasses/stringClass/index.page-vue-render.js index 705edc17ed..c886a7c331 100644 --- a/book/cppToJava/usefulClasses/stringClass/index.page-vue-render.js +++ b/book/cppToJava/usefulClasses/stringClass/index.page-vue-render.js @@ -110,6 +110,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/cppToJava/usefulClasses/wrapperClasses/index.html b/book/cppToJava/usefulClasses/wrapperClasses/index.html index 306974362c..a97dfa1f6c 100644 --- a/book/cppToJava/usefulClasses/wrapperClasses/index.html +++ b/book/cppToJava/usefulClasses/wrapperClasses/index.html @@ -245,7 +245,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/cppToJava/usefulClasses/wrapperClasses/index.page-vue-render.js b/book/cppToJava/usefulClasses/wrapperClasses/index.page-vue-render.js index 5cfeb70847..69a973825e 100644 --- a/book/cppToJava/usefulClasses/wrapperClasses/index.page-vue-render.js +++ b/book/cppToJava/usefulClasses/wrapperClasses/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs: with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/design/index.html b/book/design/index.html index 9496f4ceaf..4b11feb240 100644 --- a/book/design/index.html +++ b/book/design/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Software design

    Introduction

    What

    Can explain what is software design

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Software design

    Introduction

    What

    Can explain what is software design

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/design/index.page-vue-render.js b/book/design/index.page-vue-render.js index d0ddfb6b3f..5bb83c084e 100644 --- a/book/design/index.page-vue-render.js +++ b/book/design/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"software-design"}},[_c('span',[_v("Software design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-design","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/design/introduction/index.html b/book/design/introduction/index.html index f6d4a3feec..9787bc188f 100644 --- a/book/design/introduction/index.html +++ b/book/design/introduction/index.html @@ -13,7 +13,7 @@

    Design → Design → -

    Introduction

    What

    Can explain what is software design

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain what is software design

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/design/introduction/index.page-vue-render.js b/book/design/introduction/index.page-vue-render.js index ce75410b72..4e6a0e3fb3 100644 --- a/book/design/introduction/index.page-vue-render.js +++ b/book/design/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/design/introduction/what/index.html b/book/design/introduction/what/index.html index 31af40d527..05cdf0bd9e 100644 --- a/book/design/introduction/what/index.html +++ b/book/design/introduction/what/index.html @@ -13,7 +13,7 @@

    Can explain what is software design

    Design → Introduction → -

    What

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/design/introduction/what/index.page-vue-render.js b/book/design/introduction/what/index.page-vue-render.js index 612d091bb4..51f781bf42 100644 --- a/book/design/introduction/what/index.page-vue-render.js +++ b/book/design/introduction/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Software design has two main aspects: with(this){return _c('ul',[_c('li',[_c('strong',[_v("Product/external design: designing the external behavior of the product to meet the users' requirements.")]),_v(" This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.")]),_v(" "),_c('li',[_c('strong',[_v("Implementation/internal design: designing how the product will be implemented to meet the required external behavior.")]),_v(" This is usually done by software architects and software engineers.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/agileDesign/index.html b/book/designApproaches/agileDesign/index.html index 9648b1e97a..a82130ee3b 100644 --- a/book/designApproaches/agileDesign/index.html +++ b/book/designApproaches/agileDesign/index.html @@ -13,7 +13,7 @@

    Design → Design Approaches → -

    Agile design

    Agile design

    Can explain agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Agile design

    Agile design

    Can explain agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/agileDesign/index.page-vue-render.js b/book/designApproaches/agileDesign/index.page-vue-render.js index 3642899b89..afa3eaddb3 100644 --- a/book/designApproaches/agileDesign/index.page-vue-render.js +++ b/book/designApproaches/agileDesign/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"agile-design"}},[_c('span',[_v("Agile design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#agile-design","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/agileDesign/what/index.html b/book/designApproaches/agileDesign/what/index.html index 7bd326ef85..92de7aff0c 100644 --- a/book/designApproaches/agileDesign/what/index.html +++ b/book/designApproaches/agileDesign/what/index.html @@ -13,7 +13,7 @@

    Can explain agile design

    Design Approaches → Agile Design → -

    Agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/agileDesign/what/index.page-vue-render.js b/book/designApproaches/agileDesign/what/index.page-vue-render.js index 3da5a5aba4..984711a41f 100644 --- a/book/designApproaches/agileDesign/what/index.page-vue-render.js +++ b/book/designApproaches/agileDesign/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_c('em',[_v("Agile design")]),_ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/index.html b/book/designApproaches/index.html index d3610183e7..9dc77f2b57 100644 --- a/book/designApproaches/index.html +++ b/book/designApproaches/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Design approaches

    Multi-level design

    Multi-level design

    Can explain multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:






    Top-down and bottom-up design

    Top-down and bottom-up design

    Can explain top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?




    Agile design

    Agile design

    Can explain agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design approaches

    Multi-level design

    Multi-level design

    Can explain multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:






    Top-down and bottom-up design

    Top-down and bottom-up design

    Can explain top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?




    Agile design

    Agile design

    Can explain agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/index.page-vue-render.js b/book/designApproaches/index.page-vue-render.js index 23e722d55d..f6dc1ea531 100644 --- a/book/designApproaches/index.page-vue-render.js +++ b/book/designApproaches/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"design-approaches"}},[_c('span',[_v("Design approaches")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design-approaches","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/multilevelDesign/index.html b/book/designApproaches/multilevelDesign/index.html index 69f94ea4ec..23fd70ff97 100644 --- a/book/designApproaches/multilevelDesign/index.html +++ b/book/designApproaches/multilevelDesign/index.html @@ -13,7 +13,7 @@

    Design → Design Approaches → -

    Multi-level design

    Multi-level design

    Can explain multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:





    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Multi-level design

    Multi-level design

    Can explain multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:





    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/multilevelDesign/index.page-vue-render.js b/book/designApproaches/multilevelDesign/index.page-vue-render.js index 3e7355a425..ad8c198504 100644 --- a/book/designApproaches/multilevelDesign/index.page-vue-render.js +++ b/book/designApproaches/multilevelDesign/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"multi-level-design"}},[_c('span',[_v("Multi-level design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#multi-level-design","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/multilevelDesign/what/index.html b/book/designApproaches/multilevelDesign/what/index.html index f24ca97302..e4c76eb671 100644 --- a/book/designApproaches/multilevelDesign/what/index.html +++ b/book/designApproaches/multilevelDesign/what/index.html @@ -13,7 +13,7 @@

    Can explain multi-level design

    Design → Introduction → -

    Multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/multilevelDesign/what/index.page-vue-render.js b/book/designApproaches/multilevelDesign/what/index.page-vue-render.js index 72d2b1bef5..2941eba8e0 100644 --- a/book/designApproaches/multilevelDesign/what/index.page-vue-render.js +++ b/book/designApproaches/multilevelDesign/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"multi-level-design"}},[_c('spa with(this){return _c('p',[_c('strong',[_v("The design of bigger systems needs to be done/shown at multiple levels.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/topDownBottomUp/index.html b/book/designApproaches/topDownBottomUp/index.html index 1f29b2864f..ae3a2e7a88 100644 --- a/book/designApproaches/topDownBottomUp/index.html +++ b/book/designApproaches/topDownBottomUp/index.html @@ -13,7 +13,7 @@

    Design → Design Approaches → -

    Top-down and bottom-up design

    Top-down and bottom-up design

    Can explain top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Top-down and bottom-up design

    Top-down and bottom-up design

    Can explain top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/topDownBottomUp/index.page-vue-render.js b/book/designApproaches/topDownBottomUp/index.page-vue-render.js index 8850590158..fab3377425 100644 --- a/book/designApproaches/topDownBottomUp/index.page-vue-render.js +++ b/book/designApproaches/topDownBottomUp/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"top-down-and-bottom-up-design"}},[_c('span',[_v("Top-down and bottom-up design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#top-down-and-bottom-up-design","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designApproaches/topDownBottomUp/what/index.html b/book/designApproaches/topDownBottomUp/what/index.html index df4ecc4c51..cd7ee07225 100644 --- a/book/designApproaches/topDownBottomUp/what/index.html +++ b/book/designApproaches/topDownBottomUp/what/index.html @@ -13,7 +13,7 @@

    Can explain top-down and bottom-up design

    Design → Design Approaches → -

    Top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designApproaches/topDownBottomUp/what/index.page-vue-render.js b/book/designApproaches/topDownBottomUp/what/index.page-vue-render.js index c4169c23c2..0b0770d683 100644 --- a/book/designApproaches/topDownBottomUp/what/index.page-vue-render.js +++ b/book/designApproaches/topDownBottomUp/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_v("Multi-level design can be d with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/abstraction/index.html b/book/designFundamentals/abstraction/index.html index 7a08a3fe97..3c519d084b 100644 --- a/book/designFundamentals/abstraction/index.html +++ b/book/designFundamentals/abstraction/index.html @@ -13,7 +13,7 @@

    Design → Design Fundamentals → -

    Abstraction

    What

    Can explain abstraction

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Abstraction

    What

    Can explain abstraction

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/abstraction/index.page-vue-render.js b/book/designFundamentals/abstraction/index.page-vue-render.js index 0da61029a9..cd7589d34b 100644 --- a/book/designFundamentals/abstraction/index.page-vue-render.js +++ b/book/designFundamentals/abstraction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"abstraction"}},[_c('span',[_v("Abstraction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#abstraction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/abstraction/what/index.html b/book/designFundamentals/abstraction/what/index.html index b818487c5c..167014a428 100644 --- a/book/designFundamentals/abstraction/what/index.html +++ b/book/designFundamentals/abstraction/what/index.html @@ -13,7 +13,7 @@

    Can explain abstraction

    Design → Design Fundamentals → Abstraction → -

    What

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/abstraction/what/index.page-vue-render.js b/book/designFundamentals/abstraction/what/index.page-vue-render.js index 39949c6b68..f3a643c660 100644 --- a/book/designFundamentals/abstraction/what/index.page-vue-render.js +++ b/book/designFundamentals/abstraction/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Abstraction can be applied repeatedly with(this){return _c('p',[_c('strong',[_v("Abstraction is a general concept that is not limited to just data or control abstractions.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/cohesion/how/index.html b/book/designFundamentals/cohesion/how/index.html index 054cbf9ce2..8fcf19ed81 100644 --- a/book/designFundamentals/cohesion/how/index.html +++ b/book/designFundamentals/cohesion/how/index.html @@ -13,7 +13,7 @@

    Can increase cohesion

    Design → Design Fundamentals → Cohesion → -

    How

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/cohesion/how/index.page-vue-render.js b/book/designFundamentals/cohesion/how/index.page-vue-render.js index 32b23c3538..f08016e71d 100644 --- a/book/designFundamentals/cohesion/how/index.page-vue-render.js +++ b/book/designFundamentals/cohesion/how/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_v("Code related to a single concept is kept with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/cohesion/index.html b/book/designFundamentals/cohesion/index.html index 1404fb3f66..4f76091341 100644 --- a/book/designFundamentals/cohesion/index.html +++ b/book/designFundamentals/cohesion/index.html @@ -13,7 +13,7 @@

    Design → Design Fundamentals → -

    Cohesion

    What

    Can explain cohesion

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Can increase cohesion

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Cohesion

    What

    Can explain cohesion

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Can increase cohesion

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/cohesion/index.page-vue-render.js b/book/designFundamentals/cohesion/index.page-vue-render.js index e8e4be6edc..28f4818536 100644 --- a/book/designFundamentals/cohesion/index.page-vue-render.js +++ b/book/designFundamentals/cohesion/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"cohesion"}},[_c('span',[_v("Cohesion")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cohesion","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/cohesion/what/index.html b/book/designFundamentals/cohesion/what/index.html index c5c0323136..901b9e0f7b 100644 --- a/book/designFundamentals/cohesion/what/index.html +++ b/book/designFundamentals/cohesion/what/index.html @@ -13,7 +13,7 @@

    Can explain cohesion

    Design → Design Fundamentals → Cohesion → -

    What

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/cohesion/what/index.page-vue-render.js b/book/designFundamentals/cohesion/what/index.page-vue-render.js index de1e3c1aa0..fdddd46e08 100644 --- a/book/designFundamentals/cohesion/what/index.page-vue-render.js +++ b/book/designFundamentals/cohesion/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain cohesion")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Design → Design Fundamentals → Cohesion →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Cohesion")]),_v(" is a measure of how strongly-related and focused the various responsibilities of a component are.")]),_v(" A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.")]),_v(" "),_c('p',[_c('strong',[_v("Higher cohesion is better.")]),_v(" Disadvantages of low cohesion (aka "),_c('em',[_v("weak")]),_v(" cohesion):")]),_v(" "),_c('ul',[_c('li',[_v("Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.")]),_v(" "),_c('li',[_v("Lowers maintainability because a module can be modified due to unrelated causes "),_c('span',{staticClass:"dimmed"},[_v("(reason: the module contains code unrelated to each other)")]),_v(" or many modules may need to be modified to achieve a small change in behavior "),_c('span',{staticClass:"dimmed"},[_v("(reason: because the code related to that change is not localized to a single module)")]),_v(".")]),_v(" "),_c('li',[_v("Lowers reusability of modules because they do not represent logical units of functionality.")])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/coupling/how/index.html b/book/designFundamentals/coupling/how/index.html index a438de0eb9..ce0a2651d0 100644 --- a/book/designFundamentals/coupling/how/index.html +++ b/book/designFundamentals/coupling/how/index.html @@ -13,7 +13,7 @@

    Can reduce coupling

    Design → Design Fundamentals → Coupling → -

    How

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/coupling/how/index.page-vue-render.js b/book/designFundamentals/coupling/how/index.page-vue-render.js index d4647855c5..3a920685bc 100644 --- a/book/designFundamentals/coupling/how/index.page-vue-render.js +++ b/book/designFundamentals/coupling/how/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("X is "),_c('em',[_v("coupled")]),_v(" with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/coupling/index.html b/book/designFundamentals/coupling/index.html index 9d0428f57e..48a50ca911 100644 --- a/book/designFundamentals/coupling/index.html +++ b/book/designFundamentals/coupling/index.html @@ -13,7 +13,7 @@

    Design → Design Fundamentals → -

    Coupling

    What

    Can explain coupling

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling



    How

    Can reduce coupling

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?



    Types of coupling

    Can identify types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Coupling

    What

    Can explain coupling

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling



    How

    Can reduce coupling

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?



    Types of coupling

    Can identify types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/coupling/index.page-vue-render.js b/book/designFundamentals/coupling/index.page-vue-render.js index cfc3582882..bbf1fcfad8 100644 --- a/book/designFundamentals/coupling/index.page-vue-render.js +++ b/book/designFundamentals/coupling/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"coupling"}},[_c('span',[_v("Coupling")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#coupling","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/coupling/types/index.html b/book/designFundamentals/coupling/types/index.html index 9e009d5184..752d550b4a 100644 --- a/book/designFundamentals/coupling/types/index.html +++ b/book/designFundamentals/coupling/types/index.html @@ -13,7 +13,7 @@

    Can identify types of coupling

    Design → Design Fundamentals → Coupling → -

    Types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/coupling/types/index.page-vue-render.js b/book/designFundamentals/coupling/types/index.page-vue-render.js index ceaa4027f1..b8167542ed 100644 --- a/book/designFundamentals/coupling/types/index.page-vue-render.js +++ b/book/designFundamentals/coupling/types/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can identify types of coupling")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Design → Design Fundamentals → Coupling →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"types-of-coupling"}},[_c('span',[_v("Types of coupling")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#types-of-coupling","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Some examples of different coupling types:")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Content coupling")]),_v(": one module modifies or relies on the internal workings of another module "),_c('span',{staticClass:"dimmed"},[_v("e.g., accessing local data of another module")])]),_v(" "),_c('li',[_c('strong',[_v("Common/Global coupling")]),_v(": two modules share the same global data")]),_v(" "),_c('li',[_c('strong',[_v("Control coupling")]),_v(": one module controlling the flow of another, by passing it information on what to do "),_c('span',{staticClass:"dimmed"},[_v("e.g., passing a flag")])]),_v(" "),_c('li',[_c('strong',[_v("Data coupling")]),_v(": one module sharing data with another module "),_c('span',{staticClass:"dimmed"},[_v("e.g. via passing parameters")])]),_v(" "),_c('li',[_c('strong',[_v("External coupling")]),_v(": two modules share an externally imposed convention "),_c('span',{staticClass:"dimmed"},[_v("e.g., data formats, communication protocols, device interfaces")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Subclass coupling")]),_v(": a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.")]),_v(" "),_c('li',[_c('strong',[_v("Temporal coupling")]),_v(": two actions are bundled together just because they happen to occur at the same time "),_c('span',{staticClass:"dimmed"},[_v("e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/coupling/what/index.html b/book/designFundamentals/coupling/what/index.html index 1aa2b068fc..3783e0fd67 100644 --- a/book/designFundamentals/coupling/what/index.html +++ b/book/designFundamentals/coupling/what/index.html @@ -13,7 +13,7 @@

    Can explain coupling

    Design → Design Fundamentals → Coupling → -

    What

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/coupling/what/index.page-vue-render.js b/book/designFundamentals/coupling/what/index.page-vue-render.js index 001200a737..a636f44093 100644 --- a/book/designFundamentals/coupling/what/index.page-vue-render.js +++ b/book/designFundamentals/coupling/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Maintenance is harder")]),_ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designFundamentals/index.html b/book/designFundamentals/index.html index b3211bad45..406f0aaf09 100644 --- a/book/designFundamentals/index.html +++ b/book/designFundamentals/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Design fundamentals

    Abstraction

    What

    Can explain abstraction

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.


    Coupling

    What

    Can explain coupling

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling



    How

    Can reduce coupling

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?



    Types of coupling

    Can identify types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other


    Cohesion

    What

    Can explain cohesion

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Can increase cohesion

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design fundamentals

    Abstraction

    What

    Can explain abstraction

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.


    Coupling

    What

    Can explain coupling

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling



    How

    Can reduce coupling

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?



    Types of coupling

    Can identify types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other


    Cohesion

    What

    Can explain cohesion

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Can increase cohesion

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designFundamentals/index.page-vue-render.js b/book/designFundamentals/index.page-vue-render.js index abea146fed..9e14356b1d 100644 --- a/book/designFundamentals/index.page-vue-render.js +++ b/book/designFundamentals/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"design-fundamentals"}},[_c('span',[_v("Design fundamentals")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design-fundamentals","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/abstractionOccurrence/index.html b/book/designPatterns/abstractionOccurrence/index.html index 348118ac8d..15ad4f9757 100644 --- a/book/designPatterns/abstractionOccurrence/index.html +++ b/book/designPatterns/abstractionOccurrence/index.html @@ -13,7 +13,7 @@

    Design → Design Patterns → -

    Abstraction occurrence pattern

    What

    Can explain the Abstraction Occurrence design pattern

    Context

    There is a group of similar entities that appear to be ‘occurrences’ (or ‘copies’) of the same thing, sharing lots of common information, but also differing in significant ways.

    In a library, there can be multiple copies of the same book title. Each copy shares common information such as book title, author, ISBN, etc. However, there are also significant differences like purchase date and barcode number (assumed to be unique for each copy of the book).

    Other examples:

    • Episodes of the same TV series
    • Stock items of the same product model (e.g. TV sets of the same model)

    Problem

    Representing the objects mentioned previously as a single class would be problematic because it results in duplication of data which can lead to inconsistencies in data (if some of the duplicates are not updated consistently).

    Take for example the problem of representing books in a library. Assume that there could be multiple copies of the same title, bearing the same ISBN number, but different serial numbers.

    The above solution requires common information to be duplicated by all instances. This will not only waste storage space, but also creates a consistency problem. Suppose that after creating several copies of the same title, the librarian realized that the author name was wrongly spelt. To correct this mistake, the system needs to go through every copy of the same title to make the correction. Also, if a new copy of the title is added later on, the librarian (or the system) has to make sure that all information entered is the same as the existing copies to avoid inconsistency.

    Anti-pattern

    Refer to the same Library example given above.

    The design above segregates the common and unique information into a class hierarchy. Each book title is represented by a separate class with common data (i.e. Name, Author, ISBN) hard-coded in the class itself. This solution is problematic because each book title is represented as a class, resulting in thousands of classes (one for each title). Every time the library buys new books, the source code of the system will have to be updated with new classes.

    Solution

    Let a copy of an entity (e.g. a copy of a book) be represented by two objects instead of one, separating the common and unique information into two classes to avoid duplication.

    Given below is how the pattern is applied to the Library example:

    Here's a more generic example:

    The general solution:

    The <<Abstraction>> class should hold all common information, and the unique information should be kept by the <<Occurrence>> class. Note that ‘Abstraction’ and ‘Occurrence’ are not class names, but roles played by each class. Think of this diagram as a meta-model (i.e. a ‘model of a model’) of the BookTitle-BookCopy class diagram given above.


    Exercises:

    Which situations match the pattern?


    Apply pattern?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Abstraction occurrence pattern

    What

    Can explain the Abstraction Occurrence design pattern

    Context

    There is a group of similar entities that appear to be ‘occurrences’ (or ‘copies’) of the same thing, sharing lots of common information, but also differing in significant ways.

    In a library, there can be multiple copies of the same book title. Each copy shares common information such as book title, author, ISBN, etc. However, there are also significant differences like purchase date and barcode number (assumed to be unique for each copy of the book).

    Other examples:

    • Episodes of the same TV series
    • Stock items of the same product model (e.g. TV sets of the same model)

    Problem

    Representing the objects mentioned previously as a single class would be problematic because it results in duplication of data which can lead to inconsistencies in data (if some of the duplicates are not updated consistently).

    Take for example the problem of representing books in a library. Assume that there could be multiple copies of the same title, bearing the same ISBN number, but different serial numbers.

    The above solution requires common information to be duplicated by all instances. This will not only waste storage space, but also creates a consistency problem. Suppose that after creating several copies of the same title, the librarian realized that the author name was wrongly spelt. To correct this mistake, the system needs to go through every copy of the same title to make the correction. Also, if a new copy of the title is added later on, the librarian (or the system) has to make sure that all information entered is the same as the existing copies to avoid inconsistency.

    Anti-pattern

    Refer to the same Library example given above.

    The design above segregates the common and unique information into a class hierarchy. Each book title is represented by a separate class with common data (i.e. Name, Author, ISBN) hard-coded in the class itself. This solution is problematic because each book title is represented as a class, resulting in thousands of classes (one for each title). Every time the library buys new books, the source code of the system will have to be updated with new classes.

    Solution

    Let a copy of an entity (e.g. a copy of a book) be represented by two objects instead of one, separating the common and unique information into two classes to avoid duplication.

    Given below is how the pattern is applied to the Library example:

    Here's a more generic example:

    The general solution:

    The <<Abstraction>> class should hold all common information, and the unique information should be kept by the <<Occurrence>> class. Note that ‘Abstraction’ and ‘Occurrence’ are not class names, but roles played by each class. Think of this diagram as a meta-model (i.e. a ‘model of a model’) of the BookTitle-BookCopy class diagram given above.


    Exercises:

    Which situations match the pattern?


    Apply pattern?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/abstractionOccurrence/index.page-vue-render.js b/book/designPatterns/abstractionOccurrence/index.page-vue-render.js index 50bbd35cd8..abb586e396 100644 --- a/book/designPatterns/abstractionOccurrence/index.page-vue-render.js +++ b/book/designPatterns/abstractionOccurrence/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"abstraction-occurrence-pattern"}},[_c('span',[_v("Abstraction occurrence pattern")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#abstraction-occurrence-pattern","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/abstractionOccurrence/what/index.html b/book/designPatterns/abstractionOccurrence/what/index.html index 8db8e105ad..250d7067d0 100644 --- a/book/designPatterns/abstractionOccurrence/what/index.html +++ b/book/designPatterns/abstractionOccurrence/what/index.html @@ -13,7 +13,7 @@

    Can explain the Abstraction Occurrence design pattern

    Design → Design Patterns → Abstraction Occurrence Pattern → -

    What

    Context

    There is a group of similar entities that appear to be ‘occurrences’ (or ‘copies’) of the same thing, sharing lots of common information, but also differing in significant ways.

    In a library, there can be multiple copies of the same book title. Each copy shares common information such as book title, author, ISBN, etc. However, there are also significant differences like purchase date and barcode number (assumed to be unique for each copy of the book).

    Other examples:

    • Episodes of the same TV series
    • Stock items of the same product model (e.g. TV sets of the same model)

    Problem

    Representing the objects mentioned previously as a single class would be problematic because it results in duplication of data which can lead to inconsistencies in data (if some of the duplicates are not updated consistently).

    Take for example the problem of representing books in a library. Assume that there could be multiple copies of the same title, bearing the same ISBN number, but different serial numbers.

    The above solution requires common information to be duplicated by all instances. This will not only waste storage space, but also creates a consistency problem. Suppose that after creating several copies of the same title, the librarian realized that the author name was wrongly spelt. To correct this mistake, the system needs to go through every copy of the same title to make the correction. Also, if a new copy of the title is added later on, the librarian (or the system) has to make sure that all information entered is the same as the existing copies to avoid inconsistency.

    Anti-pattern

    Refer to the same Library example given above.

    The design above segregates the common and unique information into a class hierarchy. Each book title is represented by a separate class with common data (i.e. Name, Author, ISBN) hard-coded in the class itself. This solution is problematic because each book title is represented as a class, resulting in thousands of classes (one for each title). Every time the library buys new books, the source code of the system will have to be updated with new classes.

    Solution

    Let a copy of an entity (e.g. a copy of a book) be represented by two objects instead of one, separating the common and unique information into two classes to avoid duplication.

    Given below is how the pattern is applied to the Library example:

    Here's a more generic example:

    The general solution:

    The <<Abstraction>> class should hold all common information, and the unique information should be kept by the <<Occurrence>> class. Note that ‘Abstraction’ and ‘Occurrence’ are not class names, but roles played by each class. Think of this diagram as a meta-model (i.e. a ‘model of a model’) of the BookTitle-BookCopy class diagram given above.


    Exercises:

    Which situations match the pattern?


    Apply pattern?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Context

    There is a group of similar entities that appear to be ‘occurrences’ (or ‘copies’) of the same thing, sharing lots of common information, but also differing in significant ways.

    In a library, there can be multiple copies of the same book title. Each copy shares common information such as book title, author, ISBN, etc. However, there are also significant differences like purchase date and barcode number (assumed to be unique for each copy of the book).

    Other examples:

    • Episodes of the same TV series
    • Stock items of the same product model (e.g. TV sets of the same model)

    Problem

    Representing the objects mentioned previously as a single class would be problematic because it results in duplication of data which can lead to inconsistencies in data (if some of the duplicates are not updated consistently).

    Take for example the problem of representing books in a library. Assume that there could be multiple copies of the same title, bearing the same ISBN number, but different serial numbers.

    The above solution requires common information to be duplicated by all instances. This will not only waste storage space, but also creates a consistency problem. Suppose that after creating several copies of the same title, the librarian realized that the author name was wrongly spelt. To correct this mistake, the system needs to go through every copy of the same title to make the correction. Also, if a new copy of the title is added later on, the librarian (or the system) has to make sure that all information entered is the same as the existing copies to avoid inconsistency.

    Anti-pattern

    Refer to the same Library example given above.

    The design above segregates the common and unique information into a class hierarchy. Each book title is represented by a separate class with common data (i.e. Name, Author, ISBN) hard-coded in the class itself. This solution is problematic because each book title is represented as a class, resulting in thousands of classes (one for each title). Every time the library buys new books, the source code of the system will have to be updated with new classes.

    Solution

    Let a copy of an entity (e.g. a copy of a book) be represented by two objects instead of one, separating the common and unique information into two classes to avoid duplication.

    Given below is how the pattern is applied to the Library example:

    Here's a more generic example:

    The general solution:

    The <<Abstraction>> class should hold all common information, and the unique information should be kept by the <<Occurrence>> class. Note that ‘Abstraction’ and ‘Occurrence’ are not class names, but roles played by each class. Think of this diagram as a meta-model (i.e. a ‘model of a model’) of the BookTitle-BookCopy class diagram given above.


    Exercises:

    Which situations match the pattern?


    Apply pattern?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/abstractionOccurrence/what/index.page-vue-render.js b/book/designPatterns/abstractionOccurrence/what/index.page-vue-render.js index cf4f8b48d6..b6ad87dc44 100644 --- a/book/designPatterns/abstractionOccurrence/what/index.page-vue-render.js +++ b/book/designPatterns/abstractionOccurrence/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_v("The "),_c('code',{pre:true,attrs:{"class":"line-nu with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/command/index.html b/book/designPatterns/command/index.html index 9cffc0be58..5153b482c0 100644 --- a/book/designPatterns/command/index.html +++ b/book/designPatterns/command/index.html @@ -13,7 +13,7 @@

    Design → Design Patterns → -

    Command pattern

    What

    Can explain the Command design pattern

    Context

    A system is required to execute a number of commands, each doing a different task. For example, a system might have to support Sort, List, Reset commands.

    Problem

    It is preferable that some part of the code executes these commands without having to know each command type. e.g., there can be a CommandQueue object that is responsible for queuing commands and executing them without knowledge of what each command does.

    Solution

    The essential element of this pattern is to have a general <<Command>> object that can be passed around, stored, executed, etc without knowing the type of command (i.e. via polymorphism).

    Let us examine an example application of the pattern first:

    In the example solution below, the CommandCreator creates List, Sort, and Reset Command objects and adds them to the CommandQueue object. The CommandQueue object treats them all as Command objects and performs the execute/undo operation on each of them without knowledge of the specific Command type. When executed, each Command object will access the DataStore object to carry out its task. The Command class can also be an abstract class or an interface.

    The general form of the solution is as follows.

    The <<Client>> creates a <<ConcreteCommand>> object, and passes it to the <<Invoker>>. The <<Invoker>> object treats all commands as a general <<Command>> type. <<Invoker>> issues a request by calling execute() on the command. If a command is undoable, <<ConcreteCommand>> will store the state for undoing the command prior to invoking execute(). In addition, the <<ConcreteCommand>> object may have to be linked to any <<Receiver>> of the command () before it is passed to the <<Invoker>>. Note that an application of the command pattern does not have to follow the structure given above.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Command pattern

    What

    Can explain the Command design pattern

    Context

    A system is required to execute a number of commands, each doing a different task. For example, a system might have to support Sort, List, Reset commands.

    Problem

    It is preferable that some part of the code executes these commands without having to know each command type. e.g., there can be a CommandQueue object that is responsible for queuing commands and executing them without knowledge of what each command does.

    Solution

    The essential element of this pattern is to have a general <<Command>> object that can be passed around, stored, executed, etc without knowing the type of command (i.e. via polymorphism).

    Let us examine an example application of the pattern first:

    In the example solution below, the CommandCreator creates List, Sort, and Reset Command objects and adds them to the CommandQueue object. The CommandQueue object treats them all as Command objects and performs the execute/undo operation on each of them without knowledge of the specific Command type. When executed, each Command object will access the DataStore object to carry out its task. The Command class can also be an abstract class or an interface.

    The general form of the solution is as follows.

    The <<Client>> creates a <<ConcreteCommand>> object, and passes it to the <<Invoker>>. The <<Invoker>> object treats all commands as a general <<Command>> type. <<Invoker>> issues a request by calling execute() on the command. If a command is undoable, <<ConcreteCommand>> will store the state for undoing the command prior to invoking execute(). In addition, the <<ConcreteCommand>> object may have to be linked to any <<Receiver>> of the command () before it is passed to the <<Invoker>>. Note that an application of the command pattern does not have to follow the structure given above.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/command/index.page-vue-render.js b/book/designPatterns/command/index.page-vue-render.js index 2aa990f1e2..320c12adfa 100644 --- a/book/designPatterns/command/index.page-vue-render.js +++ b/book/designPatterns/command/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"command-pattern"}},[_c('span',[_v("Command pattern")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#command-pattern","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/command/what/index.html b/book/designPatterns/command/what/index.html index d8e6c70cfb..3dd4e9a067 100644 --- a/book/designPatterns/command/what/index.html +++ b/book/designPatterns/command/what/index.html @@ -13,7 +13,7 @@

    Can explain the Command design pattern

    Design → Design Patterns → Command Pattern → -

    What

    Context

    A system is required to execute a number of commands, each doing a different task. For example, a system might have to support Sort, List, Reset commands.

    Problem

    It is preferable that some part of the code executes these commands without having to know each command type. e.g., there can be a CommandQueue object that is responsible for queuing commands and executing them without knowledge of what each command does.

    Solution

    The essential element of this pattern is to have a general <<Command>> object that can be passed around, stored, executed, etc without knowing the type of command (i.e. via polymorphism).

    Let us examine an example application of the pattern first:

    In the example solution below, the CommandCreator creates List, Sort, and Reset Command objects and adds them to the CommandQueue object. The CommandQueue object treats them all as Command objects and performs the execute/undo operation on each of them without knowledge of the specific Command type. When executed, each Command object will access the DataStore object to carry out its task. The Command class can also be an abstract class or an interface.

    The general form of the solution is as follows.

    The <<Client>> creates a <<ConcreteCommand>> object, and passes it to the <<Invoker>>. The <<Invoker>> object treats all commands as a general <<Command>> type. <<Invoker>> issues a request by calling execute() on the command. If a command is undoable, <<ConcreteCommand>> will store the state for undoing the command prior to invoking execute(). In addition, the <<ConcreteCommand>> object may have to be linked to any <<Receiver>> of the command () before it is passed to the <<Invoker>>. Note that an application of the command pattern does not have to follow the structure given above.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Context

    A system is required to execute a number of commands, each doing a different task. For example, a system might have to support Sort, List, Reset commands.

    Problem

    It is preferable that some part of the code executes these commands without having to know each command type. e.g., there can be a CommandQueue object that is responsible for queuing commands and executing them without knowledge of what each command does.

    Solution

    The essential element of this pattern is to have a general <<Command>> object that can be passed around, stored, executed, etc without knowing the type of command (i.e. via polymorphism).

    Let us examine an example application of the pattern first:

    In the example solution below, the CommandCreator creates List, Sort, and Reset Command objects and adds them to the CommandQueue object. The CommandQueue object treats them all as Command objects and performs the execute/undo operation on each of them without knowledge of the specific Command type. When executed, each Command object will access the DataStore object to carry out its task. The Command class can also be an abstract class or an interface.

    The general form of the solution is as follows.

    The <<Client>> creates a <<ConcreteCommand>> object, and passes it to the <<Invoker>>. The <<Invoker>> object treats all commands as a general <<Command>> type. <<Invoker>> issues a request by calling execute() on the command. If a command is undoable, <<ConcreteCommand>> will store the state for undoing the command prior to invoking execute(). In addition, the <<ConcreteCommand>> object may have to be linked to any <<Receiver>> of the command () before it is passed to the <<Invoker>>. Note that an application of the command pattern does not have to follow the structure given above.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/command/what/index.page-vue-render.js b/book/designPatterns/command/what/index.page-vue-render.js index 4a62056b4b..929f470425 100644 --- a/book/designPatterns/command/what/index.page-vue-render.js +++ b/book/designPatterns/command/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Solution")])])} with(this){return _c('p',[_v("The essential element of this pattern is to have a general "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" object that can be passed around, stored, executed, etc without knowing the type of command (i.e. via polymorphism).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/facade/index.html b/book/designPatterns/facade/index.html index 6ce0dede75..5729d00fb3 100644 --- a/book/designPatterns/facade/index.html +++ b/book/designPatterns/facade/index.html @@ -13,7 +13,7 @@

    Design → Design Patterns → -

    Facade pattern

    What

    Can explain the Facade design pattern

    Context

    Components need to access functionality deep inside other components.

    The UI component of a Library system might want to access functionality of the Book class contained inside the Logic component.

    Problem

    Access to the component should be allowed without exposing its internal details. e.g. the UI component should access the functionality of the Logic component without knowing that it contains a Book class within it.

    Solution

    Include a class that sits between the component internals and users of the component such that all access to the component happens through the Facade class.

    The following class diagram applies the Facade pattern to the Library System example. The LibraryLogic class is the Facade class.


    Exercises:

    Is this Facade?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Facade pattern

    What

    Can explain the Facade design pattern

    Context

    Components need to access functionality deep inside other components.

    The UI component of a Library system might want to access functionality of the Book class contained inside the Logic component.

    Problem

    Access to the component should be allowed without exposing its internal details. e.g. the UI component should access the functionality of the Logic component without knowing that it contains a Book class within it.

    Solution

    Include a class that sits between the component internals and users of the component such that all access to the component happens through the Facade class.

    The following class diagram applies the Facade pattern to the Library System example. The LibraryLogic class is the Facade class.


    Exercises:

    Is this Facade?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/facade/index.page-vue-render.js b/book/designPatterns/facade/index.page-vue-render.js index acb9be5f95..cadb03c8b3 100644 --- a/book/designPatterns/facade/index.page-vue-render.js +++ b/book/designPatterns/facade/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"facade-pattern"}},[_c('span',[_v("Facade pattern")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#facade-pattern","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/facade/what/index.html b/book/designPatterns/facade/what/index.html index 731a6ffb1a..e70abf96a0 100644 --- a/book/designPatterns/facade/what/index.html +++ b/book/designPatterns/facade/what/index.html @@ -13,7 +13,7 @@

    Can explain the Facade design pattern

    Design → Design Patterns → Facade Pattern → -

    What

    Context

    Components need to access functionality deep inside other components.

    The UI component of a Library system might want to access functionality of the Book class contained inside the Logic component.

    Problem

    Access to the component should be allowed without exposing its internal details. e.g. the UI component should access the functionality of the Logic component without knowing that it contains a Book class within it.

    Solution

    Include a class that sits between the component internals and users of the component such that all access to the component happens through the Facade class.

    The following class diagram applies the Facade pattern to the Library System example. The LibraryLogic class is the Facade class.


    Exercises:

    Is this Facade?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Context

    Components need to access functionality deep inside other components.

    The UI component of a Library system might want to access functionality of the Book class contained inside the Logic component.

    Problem

    Access to the component should be allowed without exposing its internal details. e.g. the UI component should access the functionality of the Logic component without knowing that it contains a Book class within it.

    Solution

    Include a class that sits between the component internals and users of the component such that all access to the component happens through the Facade class.

    The following class diagram applies the Facade pattern to the Library System example. The LibraryLogic class is the Facade class.


    Exercises:

    Is this Facade?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/facade/what/index.page-vue-render.js b/book/designPatterns/facade/what/index.page-vue-render.js index 85f60f295d..9a453a9cb4 100644 --- a/book/designPatterns/facade/what/index.page-vue-render.js +++ b/book/designPatterns/facade/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Solution")])])} with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/index.html b/book/designPatterns/index.html index 0d41cae7a3..26b13b2039 100644 --- a/book/designPatterns/index.html +++ b/book/designPatterns/index.html @@ -334,7 +334,7 @@
    • Chain of Responsibility, Command, Interpreter, Template Method, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor

    Using design patterns

    Can explain pros and cons of design patterns

    Design patterns provide a high-level vocabulary to talk about design.

    Someone can say 'apply Observer pattern here' instead of having to describe the mechanics of the solution in detail.

    Knowing more patterns is a way to become more ‘experienced’. Aim to learn at least the context and the problem of patterns so that when you encounter those problems you know where to look for a solution.

    Some patterns are domain-specific e.g. patterns for distributed applications, some are created in-house e.g. patterns in the company/project and some can be self-created e.g. from past experience.

    Be careful not to overuse patterns. Do not throw patterns at a problem at every opportunity. Patterns come with overhead such as adding more classes or increasing the levels of abstraction. Use them only when they are needed. Before applying a pattern, make sure that:

    • there is substantial improvement in the design, not just superficial.
    • the associated tradeoffs are carefully considered. There are times when a design pattern is not appropriate (or an overkill).

    Other types of patterns

    Can explain how patterns exist beyond the domain of software design

    The notion of capturing design ideas as "patterns" is usually attributed to Christopher Alexander. He is a building architect noted for his theories about design. His book The Timeless Way of Building talks about "design patterns" for constructing buildings.

    Here is a sample pattern from that book:

    When a room has a window with a view, the window becomes a focal point: people are attracted to the window and want to look through it. The furniture in the room creates a second focal point: everyone is attracted toward whatever point the furniture aims them at (usually the center of the room or a TV). This makes people feel uncomfortable. They want to look out the window, and toward the other focus at the same time. If you rearrange the furniture, so that its focal point becomes the window, then everyone will suddenly notice that the -room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain



    Design patterns versus design principles

    Can differentiate between design patterns and principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain



    Design patterns versus design principles

    Can differentiate between design patterns and principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/index.page-vue-render.js b/book/designPatterns/index.page-vue-render.js index 681c6300fc..29df8b87a1 100644 --- a/book/designPatterns/index.page-vue-render.js +++ b/book/designPatterns/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"software-design-patterns"}},[_c('span',[_v("Software design patterns")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-design-patterns","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/introduction/format/index.html b/book/designPatterns/introduction/format/index.html index 01a58afb22..fe1d9e3de5 100644 --- a/book/designPatterns/introduction/format/index.html +++ b/book/designPatterns/introduction/format/index.html @@ -13,7 +13,7 @@

    Can explain design patterns format

    Design → Design Patterns → Introduction → -

    Format

    The common format to describe a pattern consists of the following components:

    • Context: The situation or scenario where the design problem is encountered.
    • Problem: The main difficulty to be resolved.
    • Solution: The core of the solution. It is important to note that the solution presented only includes the most general details, which may need further refinement for a specific context.
    • Anti-patterns (optional): Commonly used solutions, which are usually incorrect and/or inferior to the Design Pattern.
    • Consequences (optional): Identifying the pros and cons of applying the pattern.
    • Other useful information (optional): Code examples, known uses, other related patterns, etc.

    Exercises:

    Anti-patterns required?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Format

    The common format to describe a pattern consists of the following components:

    • Context: The situation or scenario where the design problem is encountered.
    • Problem: The main difficulty to be resolved.
    • Solution: The core of the solution. It is important to note that the solution presented only includes the most general details, which may need further refinement for a specific context.
    • Anti-patterns (optional): Commonly used solutions, which are usually incorrect and/or inferior to the Design Pattern.
    • Consequences (optional): Identifying the pros and cons of applying the pattern.
    • Other useful information (optional): Code examples, known uses, other related patterns, etc.

    Exercises:

    Anti-patterns required?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/introduction/format/index.page-vue-render.js b/book/designPatterns/introduction/format/index.page-vue-render.js index 465ac9a1b0..7ed02bcdc1 100644 --- a/book/designPatterns/introduction/format/index.page-vue-render.js +++ b/book/designPatterns/introduction/format/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("The common format to describe a pattern with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/introduction/index.html b/book/designPatterns/introduction/index.html index 0c62ec908c..e7cf2176d5 100644 --- a/book/designPatterns/introduction/index.html +++ b/book/designPatterns/introduction/index.html @@ -13,7 +13,7 @@

    Design → Design Patterns → -

    Introduction

    What

    Can explain design patterns

    Design pattern: An elegant reusable solution to a commonly recurring problem within a given context in software design.

    In software development, there are certain problems that recur in a certain context.

    Some examples of recurring design problems:

    Design Context Recurring Problem
    Assembling a system that makes use of other existing systems implemented using different technologies What is the best architecture?
    UI needs to be updated when the data in the application backend changes How to initiate an update to the UI when data changes without coupling the backend to the UI?

    After repeated attempts at solving such problems, better solutions are discovered and refined over time. These solutions are known as design patterns, a term popularized by the seminal book Design Patterns: Elements of Reusable Object-Oriented Software by the so-called "Gang of Four" (GoF) written by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.


    Exercises:

    Definition of design patterns



    Format

    Can explain design patterns format

    The common format to describe a pattern consists of the following components:

    • Context: The situation or scenario where the design problem is encountered.
    • Problem: The main difficulty to be resolved.
    • Solution: The core of the solution. It is important to note that the solution presented only includes the most general details, which may need further refinement for a specific context.
    • Anti-patterns (optional): Commonly used solutions, which are usually incorrect and/or inferior to the Design Pattern.
    • Consequences (optional): Identifying the pros and cons of applying the pattern.
    • Other useful information (optional): Code examples, known uses, other related patterns, etc.

    Exercises:

    Anti-patterns required?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain design patterns

    Design pattern: An elegant reusable solution to a commonly recurring problem within a given context in software design.

    In software development, there are certain problems that recur in a certain context.

    Some examples of recurring design problems:

    Design Context Recurring Problem
    Assembling a system that makes use of other existing systems implemented using different technologies What is the best architecture?
    UI needs to be updated when the data in the application backend changes How to initiate an update to the UI when data changes without coupling the backend to the UI?

    After repeated attempts at solving such problems, better solutions are discovered and refined over time. These solutions are known as design patterns, a term popularized by the seminal book Design Patterns: Elements of Reusable Object-Oriented Software by the so-called "Gang of Four" (GoF) written by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.


    Exercises:

    Definition of design patterns



    Format

    Can explain design patterns format

    The common format to describe a pattern consists of the following components:

    • Context: The situation or scenario where the design problem is encountered.
    • Problem: The main difficulty to be resolved.
    • Solution: The core of the solution. It is important to note that the solution presented only includes the most general details, which may need further refinement for a specific context.
    • Anti-patterns (optional): Commonly used solutions, which are usually incorrect and/or inferior to the Design Pattern.
    • Consequences (optional): Identifying the pros and cons of applying the pattern.
    • Other useful information (optional): Code examples, known uses, other related patterns, etc.

    Exercises:

    Anti-patterns required?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/introduction/index.page-vue-render.js b/book/designPatterns/introduction/index.page-vue-render.js index 920a6566ca..8258bd422e 100644 --- a/book/designPatterns/introduction/index.page-vue-render.js +++ b/book/designPatterns/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/introduction/what/index.html b/book/designPatterns/introduction/what/index.html index 20f5280bf9..38b39d656a 100644 --- a/book/designPatterns/introduction/what/index.html +++ b/book/designPatterns/introduction/what/index.html @@ -13,7 +13,7 @@

    Can explain design patterns

    Design → Design Patterns → Introduction → -

    What

    Design pattern: An elegant reusable solution to a commonly recurring problem within a given context in software design.

    In software development, there are certain problems that recur in a certain context.

    Some examples of recurring design problems:

    Design Context Recurring Problem
    Assembling a system that makes use of other existing systems implemented using different technologies What is the best architecture?
    UI needs to be updated when the data in the application backend changes How to initiate an update to the UI when data changes without coupling the backend to the UI?

    After repeated attempts at solving such problems, better solutions are discovered and refined over time. These solutions are known as design patterns, a term popularized by the seminal book Design Patterns: Elements of Reusable Object-Oriented Software by the so-called "Gang of Four" (GoF) written by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.


    Exercises:

    Definition of design patterns


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Design pattern: An elegant reusable solution to a commonly recurring problem within a given context in software design.

    In software development, there are certain problems that recur in a certain context.

    Some examples of recurring design problems:

    Design Context Recurring Problem
    Assembling a system that makes use of other existing systems implemented using different technologies What is the best architecture?
    UI needs to be updated when the data in the application backend changes How to initiate an update to the UI when data changes without coupling the backend to the UI?

    After repeated attempts at solving such problems, better solutions are discovered and refined over time. These solutions are known as design patterns, a term popularized by the seminal book Design Patterns: Elements of Reusable Object-Oriented Software by the so-called "Gang of Four" (GoF) written by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides.


    Exercises:

    Definition of design patterns


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/introduction/what/index.page-vue-render.js b/book/designPatterns/introduction/what/index.page-vue-render.js index 71422fab43..6b75e68e25 100644 --- a/book/designPatterns/introduction/what/index.page-vue-render.js +++ b/book/designPatterns/introduction/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_v("After repeated attempts at solving such problems, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/modelViewController/index.html b/book/designPatterns/modelViewController/index.html index 7039b5257f..3671734813 100644 --- a/book/designPatterns/modelViewController/index.html +++ b/book/designPatterns/modelViewController/index.html @@ -13,7 +13,7 @@

    Design → Design Patterns → -

    Model view controller (MVC) pattern

    What

    Can explain the Model View Controller (MVC) design pattern

    Context

    Most applications support storage/retrieval of information, displaying of information to the user (often via multiple UIs having different formats), and changing stored information based on external inputs.

    Problem

    The high coupling that can result from the interlinked nature of the features described above.

    Solution

    Decouple data, presentation, and control logic of an application by separating them into three different components: Model, View and Controller.

    • View: Displays data, interacts with the user, and pulls data from the model if necessary.
    • Controller: Detects UI events such as mouse clicks and button pushes, and takes follow up action. Updates/changes the model/view when necessary.
    • Model: Stores and maintains data. Updates the view if necessary.

    The relationship between the components can be observed in the diagram below. Typically, the UI is the combination of View and Controller.

    Given below is a concrete example of MVC applied to a student management system. In this scenario, the user is retrieving the data of a student.

    In the diagram above, when the user clicks on a button using the UI, the ‘click’ event is caught and handled by the UiController. The ref frame indicates that the interactions within that frame have been extracted out to another separate sequence diagram.

    Note that in a simple UI where there’s only one view, Controller and View can be combined as one class.

    There are many variations of the MVC model used in different domains. For example, the one used in a desktop GUI could be different from the one used in a web application.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Model view controller (MVC) pattern

    What

    Can explain the Model View Controller (MVC) design pattern

    Context

    Most applications support storage/retrieval of information, displaying of information to the user (often via multiple UIs having different formats), and changing stored information based on external inputs.

    Problem

    The high coupling that can result from the interlinked nature of the features described above.

    Solution

    Decouple data, presentation, and control logic of an application by separating them into three different components: Model, View and Controller.

    • View: Displays data, interacts with the user, and pulls data from the model if necessary.
    • Controller: Detects UI events such as mouse clicks and button pushes, and takes follow up action. Updates/changes the model/view when necessary.
    • Model: Stores and maintains data. Updates the view if necessary.

    The relationship between the components can be observed in the diagram below. Typically, the UI is the combination of View and Controller.

    Given below is a concrete example of MVC applied to a student management system. In this scenario, the user is retrieving the data of a student.

    In the diagram above, when the user clicks on a button using the UI, the ‘click’ event is caught and handled by the UiController. The ref frame indicates that the interactions within that frame have been extracted out to another separate sequence diagram.

    Note that in a simple UI where there’s only one view, Controller and View can be combined as one class.

    There are many variations of the MVC model used in different domains. For example, the one used in a desktop GUI could be different from the one used in a web application.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/modelViewController/index.page-vue-render.js b/book/designPatterns/modelViewController/index.page-vue-render.js index 4eb12a0852..8706eb7a3e 100644 --- a/book/designPatterns/modelViewController/index.page-vue-render.js +++ b/book/designPatterns/modelViewController/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"model-view-controller-mvc-pattern"}},[_c('span',[_v("Model view controller (MVC) pattern")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#model-view-controller-mvc-pattern","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/modelViewController/what/index.html b/book/designPatterns/modelViewController/what/index.html index 7ad16a765f..816e714186 100644 --- a/book/designPatterns/modelViewController/what/index.html +++ b/book/designPatterns/modelViewController/what/index.html @@ -13,7 +13,7 @@

    Can explain the Model View Controller (MVC) design pattern

    Design → Design Patterns → MVC Pattern → -

    What

    Context

    Most applications support storage/retrieval of information, displaying of information to the user (often via multiple UIs having different formats), and changing stored information based on external inputs.

    Problem

    The high coupling that can result from the interlinked nature of the features described above.

    Solution

    Decouple data, presentation, and control logic of an application by separating them into three different components: Model, View and Controller.

    • View: Displays data, interacts with the user, and pulls data from the model if necessary.
    • Controller: Detects UI events such as mouse clicks and button pushes, and takes follow up action. Updates/changes the model/view when necessary.
    • Model: Stores and maintains data. Updates the view if necessary.

    The relationship between the components can be observed in the diagram below. Typically, the UI is the combination of View and Controller.

    Given below is a concrete example of MVC applied to a student management system. In this scenario, the user is retrieving the data of a student.

    In the diagram above, when the user clicks on a button using the UI, the ‘click’ event is caught and handled by the UiController. The ref frame indicates that the interactions within that frame have been extracted out to another separate sequence diagram.

    Note that in a simple UI where there’s only one view, Controller and View can be combined as one class.

    There are many variations of the MVC model used in different domains. For example, the one used in a desktop GUI could be different from the one used in a web application.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Context

    Most applications support storage/retrieval of information, displaying of information to the user (often via multiple UIs having different formats), and changing stored information based on external inputs.

    Problem

    The high coupling that can result from the interlinked nature of the features described above.

    Solution

    Decouple data, presentation, and control logic of an application by separating them into three different components: Model, View and Controller.

    • View: Displays data, interacts with the user, and pulls data from the model if necessary.
    • Controller: Detects UI events such as mouse clicks and button pushes, and takes follow up action. Updates/changes the model/view when necessary.
    • Model: Stores and maintains data. Updates the view if necessary.

    The relationship between the components can be observed in the diagram below. Typically, the UI is the combination of View and Controller.

    Given below is a concrete example of MVC applied to a student management system. In this scenario, the user is retrieving the data of a student.

    In the diagram above, when the user clicks on a button using the UI, the ‘click’ event is caught and handled by the UiController. The ref frame indicates that the interactions within that frame have been extracted out to another separate sequence diagram.

    Note that in a simple UI where there’s only one view, Controller and View can be combined as one class.

    There are many variations of the MVC model used in different domains. For example, the one used in a desktop GUI could be different from the one used in a web application.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/modelViewController/what/index.page-vue-render.js b/book/designPatterns/modelViewController/what/index.page-vue-render.js index 23c804b482..92ca71b7c6 100644 --- a/book/designPatterns/modelViewController/what/index.page-vue-render.js +++ b/book/designPatterns/modelViewController/what/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_v("The relationship between the components can be obs with(this){return _c('p',[_v("Note that in a simple UI where there’s only one view, "),_c('em',[_v("Controller")]),_v(" and "),_c('em',[_v("View")]),_v(" can be combined as one class.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/more/combiningDesignPatterns/index.html b/book/designPatterns/more/combiningDesignPatterns/index.html index f9a70e0c79..5ea8a07fe3 100644 --- a/book/designPatterns/more/combiningDesignPatterns/index.html +++ b/book/designPatterns/more/combiningDesignPatterns/index.html @@ -13,7 +13,7 @@

    Can combine multiple patterns to fit a context

    Design → Design Patterns → -

    Combining design patterns

    Design patterns are usually embedded in a larger design and sometimes applied in combination with other design patterns.

    Let us look at a case study that shows how design patterns are used in the design of a class structure for a Stock Inventory System (SIS) for a shop. The shop sells appliances and accessories for the appliances. SIS simply stores information about each item in the store.

    Use Cases:

    • Create a new item
    • View information about an item
    • Modify information about an item
    • View all available accessories for a given appliance
    • List all items in the store

    SIS can be accessed using multiple terminals. Shop assistants use their own terminals to access SIS, while the shop manager’s terminal continuously displays a list of all items in the store. In the future, it is expected that suppliers of items use their own applications to connect to SIS to get real-time information about the current stock status. User authentication is not required for the current version, but may be required in the future.

    A step by step explanation of the design is given below. Note that this is one out of many possible designs. Design patterns are also applied where appropriate.

    A StockItem can be an Appliance or an Accessory.

    To track that each Accessory is associated with the correct Appliance, consider the following alternative class structures.

    The third one seems more appropriate (the second one is suitable if accessories can have accessories). Next, consider between keeping a list of Appliances, and a list of StockItems. Which is more appropriate?

    The latter seems more suitable because it can handle both appliances and accessories the same way. Next, an abstraction occurrence pattern is applied to keep track of StockItems.

    Note the inclusion of navigabilities. Here’s a sample object diagram based on the class model created thus far.

    Next, apply the façade pattern to shield the SIS internals from the UI.

    As UI consists of multiple views, the MVC pattern is applied here.

    Some views need to be updated when the data changes; apply the Observer pattern here.

    In addition, the Singleton pattern can be applied to the façade class.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Combining design patterns

    Design patterns are usually embedded in a larger design and sometimes applied in combination with other design patterns.

    Let us look at a case study that shows how design patterns are used in the design of a class structure for a Stock Inventory System (SIS) for a shop. The shop sells appliances and accessories for the appliances. SIS simply stores information about each item in the store.

    Use Cases:

    • Create a new item
    • View information about an item
    • Modify information about an item
    • View all available accessories for a given appliance
    • List all items in the store

    SIS can be accessed using multiple terminals. Shop assistants use their own terminals to access SIS, while the shop manager’s terminal continuously displays a list of all items in the store. In the future, it is expected that suppliers of items use their own applications to connect to SIS to get real-time information about the current stock status. User authentication is not required for the current version, but may be required in the future.

    A step by step explanation of the design is given below. Note that this is one out of many possible designs. Design patterns are also applied where appropriate.

    A StockItem can be an Appliance or an Accessory.

    To track that each Accessory is associated with the correct Appliance, consider the following alternative class structures.

    The third one seems more appropriate (the second one is suitable if accessories can have accessories). Next, consider between keeping a list of Appliances, and a list of StockItems. Which is more appropriate?

    The latter seems more suitable because it can handle both appliances and accessories the same way. Next, an abstraction occurrence pattern is applied to keep track of StockItems.

    Note the inclusion of navigabilities. Here’s a sample object diagram based on the class model created thus far.

    Next, apply the façade pattern to shield the SIS internals from the UI.

    As UI consists of multiple views, the MVC pattern is applied here.

    Some views need to be updated when the data changes; apply the Observer pattern here.

    In addition, the Singleton pattern can be applied to the façade class.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/more/combiningDesignPatterns/index.page-vue-render.js b/book/designPatterns/more/combiningDesignPatterns/index.page-vue-render.js index 2b13a3c90e..afddb73251 100644 --- a/book/designPatterns/more/combiningDesignPatterns/index.page-vue-render.js +++ b/book/designPatterns/more/combiningDesignPatterns/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"combining-design-patterns"}},[ with(this){return _c('p',[_c('strong',[_v("Design patterns are usually embedded in a larger design and sometimes applied in combination with other design patterns.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/more/index.html b/book/designPatterns/more/index.html index 61073f8dd2..1b408fccd0 100644 --- a/book/designPatterns/more/index.html +++ b/book/designPatterns/more/index.html @@ -19,7 +19,7 @@
    • Chain of Responsibility, Command, Interpreter, Template Method, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor

    Using design patterns

    Can explain pros and cons of design patterns

    Design patterns provide a high-level vocabulary to talk about design.

    Someone can say 'apply Observer pattern here' instead of having to describe the mechanics of the solution in detail.

    Knowing more patterns is a way to become more ‘experienced’. Aim to learn at least the context and the problem of patterns so that when you encounter those problems you know where to look for a solution.

    Some patterns are domain-specific e.g. patterns for distributed applications, some are created in-house e.g. patterns in the company/project and some can be self-created e.g. from past experience.

    Be careful not to overuse patterns. Do not throw patterns at a problem at every opportunity. Patterns come with overhead such as adding more classes or increasing the levels of abstraction. Use them only when they are needed. Before applying a pattern, make sure that:

    • there is substantial improvement in the design, not just superficial.
    • the associated tradeoffs are carefully considered. There are times when a design pattern is not appropriate (or an overkill).

    Other types of patterns

    Can explain how patterns exist beyond the domain of software design

    The notion of capturing design ideas as "patterns" is usually attributed to Christopher Alexander. He is a building architect noted for his theories about design. His book The Timeless Way of Building talks about "design patterns" for constructing buildings.

    Here is a sample pattern from that book:

    When a room has a window with a view, the window becomes a focal point: people are attracted to the window and want to look through it. The furniture in the room creates a second focal point: everyone is attracted toward whatever point the furniture aims them at (usually the center of the room or a TV). This makes people feel uncomfortable. They want to look out the window, and toward the other focus at the same time. If you rearrange the furniture, so that its focal point becomes the window, then everyone will suddenly notice that the -room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain



    Design patterns versus design principles

    Can differentiate between design patterns and principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain



    Design patterns versus design principles

    Can differentiate between design patterns and principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/more/index.page-vue-render.js b/book/designPatterns/more/index.page-vue-render.js index 9970ddb641..70443dcfe8 100644 --- a/book/designPatterns/more/index.page-vue-render.js +++ b/book/designPatterns/more/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"more"}},[_c('span',[_v("More")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/more/otherDesignPatterns/index.html b/book/designPatterns/more/otherDesignPatterns/index.html index 40c1e62f02..34b5dfcfb9 100644 --- a/book/designPatterns/more/otherDesignPatterns/index.html +++ b/book/designPatterns/more/otherDesignPatterns/index.html @@ -16,7 +16,7 @@

    Other design patterns

    The most famous source of design patterns is the "Gang of Four" (GoF) book which contains 23 design patterns divided into three categories:

    • Creational: About object creation. They separate the operation of an application from how its objects are created.
      • Abstract Factory, Builder, Factory Method, Prototype, Singleton
    • Structural: About the composition of objects into larger structures while catering for future extension in structure.
      • Adapter, Bridge, Composite, Decorator, Façade, Flyweight, Proxy
    • Behavioral: Defining how objects interact and how responsibility is distributed among them. -
      • Chain of Responsibility, Command, Interpreter, Template Method, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Chain of Responsibility, Command, Interpreter, Template Method, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/more/otherDesignPatterns/index.page-vue-render.js b/book/designPatterns/more/otherDesignPatterns/index.page-vue-render.js index 7efdb752cf..7d205c1911 100644 --- a/book/designPatterns/more/otherDesignPatterns/index.page-vue-render.js +++ b/book/designPatterns/more/otherDesignPatterns/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can recognize some of the GoF design patterns")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Design → Design Patterns →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"other-design-patterns"}},[_c('span',[_v("Other design patterns")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#other-design-patterns","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("The most famous source of design patterns is the "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Design_Patterns"}},[_v("\"Gang of Four\" (GoF) book")]),_v(" which contains 23 design patterns divided into three categories")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Creational")]),_v(": About object creation. They separate the operation of an application from how its objects are created.\n"),_c('ul',[_c('li',[_v("Abstract Factory, Builder, Factory Method, Prototype, Singleton")])])]),_v(" "),_c('li',[_c('strong',[_v("Structural")]),_v(": About the composition of objects into larger structures while catering for future extension in structure.\n"),_c('ul',[_c('li',[_v("Adapter, Bridge, Composite, Decorator, Façade, Flyweight, Proxy")])])]),_v(" "),_c('li',[_c('strong',[_v("Behavioral")]),_v(": Defining how objects interact and how responsibility is distributed among them.\n"),_c('ul',[_c('li',[_v("Chain of Responsibility, Command, Interpreter, Template Method, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor")])])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/more/otherTypesOfPatterns/index.html b/book/designPatterns/more/otherTypesOfPatterns/index.html index b2b271fdc9..71168159a3 100644 --- a/book/designPatterns/more/otherTypesOfPatterns/index.html +++ b/book/designPatterns/more/otherTypesOfPatterns/index.html @@ -16,7 +16,7 @@

    Other types of patterns

    The notion of capturing design ideas as "patterns" is usually attributed to Christopher Alexander. He is a building architect noted for his theories about design. His book The Timeless Way of Building talks about "design patterns" for constructing buildings.

    Here is a sample pattern from that book:

    When a room has a window with a view, the window becomes a focal point: people are attracted to the window and want to look through it. The furniture in the room creates a second focal point: everyone is attracted toward whatever point the furniture aims them at (usually the center of the room or a TV). This makes people feel uncomfortable. They want to look out the window, and toward the other focus at the same time. If you rearrange the furniture, so that its focal point becomes the window, then everyone will suddenly notice that the -room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/more/otherTypesOfPatterns/index.page-vue-render.js b/book/designPatterns/more/otherTypesOfPatterns/index.page-vue-render.js index bb0b34c131..e2fb8a6ada 100644 --- a/book/designPatterns/more/otherTypesOfPatterns/index.page-vue-render.js +++ b/book/designPatterns/more/otherTypesOfPatterns/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("The notion of capturing design ideas as with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/more/usingDesignPatterns/index.html b/book/designPatterns/more/usingDesignPatterns/index.html index 1808fbdbbd..6e7e129cbb 100644 --- a/book/designPatterns/more/usingDesignPatterns/index.html +++ b/book/designPatterns/more/usingDesignPatterns/index.html @@ -13,7 +13,7 @@

    Can explain pros and cons of design patterns

    Design → Design Patterns → -

    Using design patterns

    Design patterns provide a high-level vocabulary to talk about design.

    Someone can say 'apply Observer pattern here' instead of having to describe the mechanics of the solution in detail.

    Knowing more patterns is a way to become more ‘experienced’. Aim to learn at least the context and the problem of patterns so that when you encounter those problems you know where to look for a solution.

    Some patterns are domain-specific e.g. patterns for distributed applications, some are created in-house e.g. patterns in the company/project and some can be self-created e.g. from past experience.

    Be careful not to overuse patterns. Do not throw patterns at a problem at every opportunity. Patterns come with overhead such as adding more classes or increasing the levels of abstraction. Use them only when they are needed. Before applying a pattern, make sure that:

    • there is substantial improvement in the design, not just superficial.
    • the associated tradeoffs are carefully considered. There are times when a design pattern is not appropriate (or an overkill).
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Using design patterns

    Design patterns provide a high-level vocabulary to talk about design.

    Someone can say 'apply Observer pattern here' instead of having to describe the mechanics of the solution in detail.

    Knowing more patterns is a way to become more ‘experienced’. Aim to learn at least the context and the problem of patterns so that when you encounter those problems you know where to look for a solution.

    Some patterns are domain-specific e.g. patterns for distributed applications, some are created in-house e.g. patterns in the company/project and some can be self-created e.g. from past experience.

    Be careful not to overuse patterns. Do not throw patterns at a problem at every opportunity. Patterns come with overhead such as adding more classes or increasing the levels of abstraction. Use them only when they are needed. Before applying a pattern, make sure that:

    • there is substantial improvement in the design, not just superficial.
    • the associated tradeoffs are carefully considered. There are times when a design pattern is not appropriate (or an overkill).
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/more/usingDesignPatterns/index.page-vue-render.js b/book/designPatterns/more/usingDesignPatterns/index.page-vue-render.js index a28fe00740..3974e7aff6 100644 --- a/book/designPatterns/more/usingDesignPatterns/index.page-vue-render.js +++ b/book/designPatterns/more/usingDesignPatterns/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Be careful not to overuse patterns.") with(this){return _c('ul',[_c('li',[_v("there is substantial improvement in the design, not just superficial.")]),_v(" "),_c('li',[_v("the associated tradeoffs are carefully considered. There are times when a design pattern is not appropriate (or an overkill).")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/more/vsPrinciples/index.html b/book/designPatterns/more/vsPrinciples/index.html index 1251f6c1dd..a2f60e103d 100644 --- a/book/designPatterns/more/vsPrinciples/index.html +++ b/book/designPatterns/more/vsPrinciples/index.html @@ -13,7 +13,7 @@ +

    Design patterns versus design principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/more/vsPrinciples/index.page-vue-render.js b/book/designPatterns/more/vsPrinciples/index.page-vue-render.js index cb1f08f814..be90b76600 100644 --- a/book/designPatterns/more/vsPrinciples/index.page-vue-render.js +++ b/book/designPatterns/more/vsPrinciples/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can differentiate between design patterns and principles")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Design → Design Patterns →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"design-patterns-versus-design-principles"}},[_c('span',[_v("Design patterns versus design principles")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design-patterns-versus-design-principles","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Design "),_c('em',[_v("principles")]),_v(" have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms.")]),_v(" Compared to design patterns, principles are "),_c('strong',[_v("more general")]),_v(", have "),_c('strong',[_v("wider applicability")]),_v(", with correspondingly "),_c('strong',[_v("greater overlap")]),_v(" among them.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/observer/index.html b/book/designPatterns/observer/index.html index c8fc63feea..7881fc685b 100644 --- a/book/designPatterns/observer/index.html +++ b/book/designPatterns/observer/index.html @@ -208,7 +208,7 @@ -

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.


    Exercises:

    Polymorphism and the Observer pattern


    Observer pattern usage



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.


    Exercises:

    Polymorphism and the Observer pattern


    Observer pattern usage



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/observer/index.page-vue-render.js b/book/designPatterns/observer/index.page-vue-render.js index 232e80e2e7..2a8a4f8e9f 100644 --- a/book/designPatterns/observer/index.page-vue-render.js +++ b/book/designPatterns/observer/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"observer-pattern"}},[_c('span',[_v("Observer pattern")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#observer-pattern","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/observer/what/index.html b/book/designPatterns/observer/what/index.html index 3fa9e9dcac..2944bf03f7 100644 --- a/book/designPatterns/observer/what/index.html +++ b/book/designPatterns/observer/what/index.html @@ -208,7 +208,7 @@ -

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.


    Exercises:

    Polymorphism and the Observer pattern


    Observer pattern usage


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.


    Exercises:

    Polymorphism and the Observer pattern


    Observer pattern usage


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/observer/what/index.page-vue-render.js b/book/designPatterns/observer/what/index.page-vue-render.js index 1afcf7f8d1..6c9c175546 100644 --- a/book/designPatterns/observer/what/index.page-vue-render.js +++ b/book/designPatterns/observer/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-num with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/singleton/evaluation/index.html b/book/designPatterns/singleton/evaluation/index.html index 544480565c..a73bdb8257 100644 --- a/book/designPatterns/singleton/evaluation/index.html +++ b/book/designPatterns/singleton/evaluation/index.html @@ -13,7 +13,7 @@

    Can decide when to apply Singleton design pattern

    Design → Design Patterns → Singleton → -

    Evaluation

    Pros:

    • easy to apply
    • effective in achieving its goal with minimal extra work
    • provides an easy way to access the singleton object from anywhere in the codebase

    Cons:

    • The singleton object acts like a global variable that increases coupling across the codebase.
    • In testing, it is difficult to replace Singleton objects with stubs (static methods cannot be overridden).
    • In testing, singleton objects carry data from one test to another even when you want each test to be independent of the others.

    Given that there are some significant cons, it is recommended that you apply the Singleton pattern when, in addition to requiring only one instance of a class, there is a risk of creating multiple objects by mistake, and creating such multiple objects has real negative consequences.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Evaluation

    Pros:

    • easy to apply
    • effective in achieving its goal with minimal extra work
    • provides an easy way to access the singleton object from anywhere in the codebase

    Cons:

    • The singleton object acts like a global variable that increases coupling across the codebase.
    • In testing, it is difficult to replace Singleton objects with stubs (static methods cannot be overridden).
    • In testing, singleton objects carry data from one test to another even when you want each test to be independent of the others.

    Given that there are some significant cons, it is recommended that you apply the Singleton pattern when, in addition to requiring only one instance of a class, there is a risk of creating multiple objects by mistake, and creating such multiple objects has real negative consequences.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/singleton/evaluation/index.page-vue-render.js b/book/designPatterns/singleton/evaluation/index.page-vue-render.js index bb825a3e03..1b76440e73 100644 --- a/book/designPatterns/singleton/evaluation/index.page-vue-render.js +++ b/book/designPatterns/singleton/evaluation/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can decide when to apply Singleton design pattern")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Design → Design Patterns → Singleton →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"evaluation"}},[_c('span',[_v("Evaluation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#evaluation","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Pros:")])]),_v(" "),_c('ul',[_c('li',[_v("easy to apply")]),_v(" "),_c('li',[_v("effective in achieving its goal with minimal extra work")]),_v(" "),_c('li',[_v("provides an easy way to access the singleton object from anywhere in the codebase")])]),_v(" "),_c('p',[_c('strong',[_v("Cons:")])]),_v(" "),_c('ul',[_c('li',[_v("The singleton object acts like a global variable that increases coupling across the codebase.")]),_v(" "),_c('li',[_v("In testing, it is difficult to replace Singleton objects with stubs (static methods cannot be overridden).")]),_v(" "),_c('li',[_v("In testing, singleton objects carry data from one test to another even when you want each test to be independent of the others.")])]),_v(" "),_c('p',[_v("Given that there are some significant cons, it is recommended that you apply the Singleton pattern when, in addition to requiring only one instance of a class, there is a risk of creating multiple objects by mistake, and creating such multiple objects has real negative consequences.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/singleton/implementation/index.html b/book/designPatterns/singleton/implementation/index.html index 380efd1425..76004c39d6 100644 --- a/book/designPatterns/singleton/implementation/index.html +++ b/book/designPatterns/singleton/implementation/index.html @@ -134,7 +134,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/singleton/implementation/index.page-vue-render.js b/book/designPatterns/singleton/implementation/index.page-vue-render.js index 3c19b02924..5d85d1828f 100644 --- a/book/designPatterns/singleton/implementation/index.page-vue-render.js +++ b/book/designPatterns/singleton/implementation/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_v("But now, the "),_c('code',{pre:true,attrs:{"class" with(this){return _c('code',{pre:true,attrs:{"class":"no-line-numbers hljs java"}},[_c('span',[_v("Logic m = Logic.getInstance();\n")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/singleton/index.html b/book/designPatterns/singleton/index.html index a4ae988bae..416d2c33de 100644 --- a/book/designPatterns/singleton/index.html +++ b/book/designPatterns/singleton/index.html @@ -134,7 +134,7 @@ -

    Evaluation

    Can decide when to apply Singleton design pattern

    Pros:

    • easy to apply
    • effective in achieving its goal with minimal extra work
    • provides an easy way to access the singleton object from anywhere in the codebase

    Cons:

    • The singleton object acts like a global variable that increases coupling across the codebase.
    • In testing, it is difficult to replace Singleton objects with stubs (static methods cannot be overridden).
    • In testing, singleton objects carry data from one test to another even when you want each test to be independent of the others.

    Given that there are some significant cons, it is recommended that you apply the Singleton pattern when, in addition to requiring only one instance of a class, there is a risk of creating multiple objects by mistake, and creating such multiple objects has real negative consequences.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Evaluation

    Can decide when to apply Singleton design pattern

    Pros:

    • easy to apply
    • effective in achieving its goal with minimal extra work
    • provides an easy way to access the singleton object from anywhere in the codebase

    Cons:

    • The singleton object acts like a global variable that increases coupling across the codebase.
    • In testing, it is difficult to replace Singleton objects with stubs (static methods cannot be overridden).
    • In testing, singleton objects carry data from one test to another even when you want each test to be independent of the others.

    Given that there are some significant cons, it is recommended that you apply the Singleton pattern when, in addition to requiring only one instance of a class, there is a risk of creating multiple objects by mistake, and creating such multiple objects has real negative consequences.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/singleton/index.page-vue-render.js b/book/designPatterns/singleton/index.page-vue-render.js index 4d5859bdc5..e8c852c27e 100644 --- a/book/designPatterns/singleton/index.page-vue-render.js +++ b/book/designPatterns/singleton/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"singleton-pattern"}},[_c('span',[_v("Singleton pattern")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#singleton-pattern","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/designPatterns/singleton/what/index.html b/book/designPatterns/singleton/what/index.html index bad5bc3f29..fc59753252 100644 --- a/book/designPatterns/singleton/what/index.html +++ b/book/designPatterns/singleton/what/index.html @@ -13,7 +13,7 @@

    Can explain the Singleton design pattern

    Design → Design Patterns → Singleton → -

    What

    Context

    Certain classes should have no more than just one instance (e.g. the main controller class of the system). These single instances are commonly known as singletons.

    Problem

    A normal class can be instantiated multiple times by invoking the constructor.

    Solution

    Make the constructor of the singleton class private, because a public constructor will allow others to instantiate the class at will. Provide a public class-level method to access the single instance.

    Example:

    The <<Singleton>> in the class above uses the UML stereotype notation, which is used to (optionally) indicate the purpose or the role played by a UML element. In this example, the class Logic is playing the role of a Singleton class. The general format is <<role/purpose>>.


    Exercises:

    Statements about the Singleton pattern


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Context

    Certain classes should have no more than just one instance (e.g. the main controller class of the system). These single instances are commonly known as singletons.

    Problem

    A normal class can be instantiated multiple times by invoking the constructor.

    Solution

    Make the constructor of the singleton class private, because a public constructor will allow others to instantiate the class at will. Provide a public class-level method to access the single instance.

    Example:

    The <<Singleton>> in the class above uses the UML stereotype notation, which is used to (optionally) indicate the purpose or the role played by a UML element. In this example, the class Logic is playing the role of a Singleton class. The general format is <<role/purpose>>.


    Exercises:

    Statements about the Singleton pattern


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/designPatterns/singleton/what/index.page-vue-render.js b/book/designPatterns/singleton/what/index.page-vue-render.js index 1d61ab8a90..15437f1284 100644 --- a/book/designPatterns/singleton/what/index.page-vue-render.js +++ b/book/designPatterns/singleton/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_v("Make the constructor of the singleton class "),_c( with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/aimForComprehensibility/how/index.html b/book/documentation/guidelines/aimForComprehensibility/how/index.html index 7725ef655a..938d042251 100644 --- a/book/documentation/guidelines/aimForComprehensibility/how/index.html +++ b/book/documentation/guidelines/aimForComprehensibility/how/index.html @@ -13,7 +13,7 @@

    Can write reasonably comprehensible developer documents

    Implementation → Documentation → Guidelines → Aim for Comprehensibility → -

    How

    Here are some tips on writing effective documentation.

    • Use plenty of diagrams: It is not enough to explain something in words; complement it with visual illustrations (e.g. a UML diagram).
    • Use plenty of examples: When explaining algorithms, show a running example to illustrate each step of the algorithm, in parallel to worded explanations.
    • Use simple and direct explanations: Convoluted explanations and fancy words will annoy readers. Avoid long sentences.
    • Get rid of statements that do not add value: For example, 'We made sure our system works perfectly' (who didn't?), 'Component X has its own responsibilities' (of course it has!).
    • It is not a good idea to have separate sections for each type of artifact, such as 'use cases', 'sequence diagrams', 'activity diagrams', etc. Such a structure, coupled with the indiscriminate inclusion of diagrams without justifying their need, indicates a failure to understand the purpose of documentation. Include diagrams when they are needed to explain something. If you want to provide additional diagrams for completeness' sake, include them in the appendix as a reference.

    Exercises:

    Statements about documentation


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    Here are some tips on writing effective documentation.

    • Use plenty of diagrams: It is not enough to explain something in words; complement it with visual illustrations (e.g. a UML diagram).
    • Use plenty of examples: When explaining algorithms, show a running example to illustrate each step of the algorithm, in parallel to worded explanations.
    • Use simple and direct explanations: Convoluted explanations and fancy words will annoy readers. Avoid long sentences.
    • Get rid of statements that do not add value: For example, 'We made sure our system works perfectly' (who didn't?), 'Component X has its own responsibilities' (of course it has!).
    • It is not a good idea to have separate sections for each type of artifact, such as 'use cases', 'sequence diagrams', 'activity diagrams', etc. Such a structure, coupled with the indiscriminate inclusion of diagrams without justifying their need, indicates a failure to understand the purpose of documentation. Include diagrams when they are needed to explain something. If you want to provide additional diagrams for completeness' sake, include them in the appendix as a reference.

    Exercises:

    Statements about documentation


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/aimForComprehensibility/how/index.page-vue-render.js b/book/documentation/guidelines/aimForComprehensibility/how/index.page-vue-render.js index e798ff96a9..15d03120f4 100644 --- a/book/documentation/guidelines/aimForComprehensibility/how/index.page-vue-render.js +++ b/book/documentation/guidelines/aimForComprehensibility/how/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("Here are some tips on writing effective with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/aimForComprehensibility/index.html b/book/documentation/guidelines/aimForComprehensibility/index.html index ad225d8d41..2762d6b376 100644 --- a/book/documentation/guidelines/aimForComprehensibility/index.html +++ b/book/documentation/guidelines/aimForComprehensibility/index.html @@ -13,7 +13,7 @@

    Implementation → Documentation → Guidelines → -

    Guideline: Aim for comprehensibility

    What

    Can explain the need for comprehensibility in documents

    Technical documents exist to help others understand technical details. Therefore, it is not enough for the documentation to be accurate and comprehensive; it should also be comprehensible.


    How

    Can write reasonably comprehensible developer documents

    Here are some tips on writing effective documentation.

    • Use plenty of diagrams: It is not enough to explain something in words; complement it with visual illustrations (e.g. a UML diagram).
    • Use plenty of examples: When explaining algorithms, show a running example to illustrate each step of the algorithm, in parallel to worded explanations.
    • Use simple and direct explanations: Convoluted explanations and fancy words will annoy readers. Avoid long sentences.
    • Get rid of statements that do not add value: For example, 'We made sure our system works perfectly' (who didn't?), 'Component X has its own responsibilities' (of course it has!).
    • It is not a good idea to have separate sections for each type of artifact, such as 'use cases', 'sequence diagrams', 'activity diagrams', etc. Such a structure, coupled with the indiscriminate inclusion of diagrams without justifying their need, indicates a failure to understand the purpose of documentation. Include diagrams when they are needed to explain something. If you want to provide additional diagrams for completeness' sake, include them in the appendix as a reference.

    Exercises:

    Statements about documentation



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Guideline: Aim for comprehensibility

    What

    Can explain the need for comprehensibility in documents

    Technical documents exist to help others understand technical details. Therefore, it is not enough for the documentation to be accurate and comprehensive; it should also be comprehensible.


    How

    Can write reasonably comprehensible developer documents

    Here are some tips on writing effective documentation.

    • Use plenty of diagrams: It is not enough to explain something in words; complement it with visual illustrations (e.g. a UML diagram).
    • Use plenty of examples: When explaining algorithms, show a running example to illustrate each step of the algorithm, in parallel to worded explanations.
    • Use simple and direct explanations: Convoluted explanations and fancy words will annoy readers. Avoid long sentences.
    • Get rid of statements that do not add value: For example, 'We made sure our system works perfectly' (who didn't?), 'Component X has its own responsibilities' (of course it has!).
    • It is not a good idea to have separate sections for each type of artifact, such as 'use cases', 'sequence diagrams', 'activity diagrams', etc. Such a structure, coupled with the indiscriminate inclusion of diagrams without justifying their need, indicates a failure to understand the purpose of documentation. Include diagrams when they are needed to explain something. If you want to provide additional diagrams for completeness' sake, include them in the appendix as a reference.

    Exercises:

    Statements about documentation



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/aimForComprehensibility/index.page-vue-render.js b/book/documentation/guidelines/aimForComprehensibility/index.page-vue-render.js index a006c790f5..3bb50838a9 100644 --- a/book/documentation/guidelines/aimForComprehensibility/index.page-vue-render.js +++ b/book/documentation/guidelines/aimForComprehensibility/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-aim-for-comprehensibility"}},[_c('span',[_v("Guideline: Aim for comprehensibility")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-aim-for-comprehensibility","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/aimForComprehensibility/what/index.html b/book/documentation/guidelines/aimForComprehensibility/what/index.html index de8f124fed..5d8232790c 100644 --- a/book/documentation/guidelines/aimForComprehensibility/what/index.html +++ b/book/documentation/guidelines/aimForComprehensibility/what/index.html @@ -13,7 +13,7 @@ +

    What

    Technical documents exist to help others understand technical details. Therefore, it is not enough for the documentation to be accurate and comprehensive; it should also be comprehensible.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/aimForComprehensibility/what/index.page-vue-render.js b/book/documentation/guidelines/aimForComprehensibility/what/index.page-vue-render.js index e04fb149d9..b46a5a58f5 100644 --- a/book/documentation/guidelines/aimForComprehensibility/what/index.page-vue-render.js +++ b/book/documentation/guidelines/aimForComprehensibility/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain the need for comprehensibility in documents")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Guidelines → Aim for Comprehensibility →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Technical documents exist to help others understand technical details. Therefore, "),_c('strong',[_v("it is not enough for the documentation to be accurate and comprehensive; it should also be comprehensible")]),_v(".")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/documentMinimally/how/index.html b/book/documentation/guidelines/documentMinimally/how/index.html index 88e37b3a31..c6874b4676 100644 --- a/book/documentation/guidelines/documentMinimally/how/index.html +++ b/book/documentation/guidelines/documentMinimally/how/index.html @@ -13,7 +13,7 @@

    Can write minimal yet sufficient documentation

    Implementation → Documentation → Guidelines → Minimal but Sufficient → -

    How

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/documentMinimally/how/index.page-vue-render.js b/book/documentation/guidelines/documentMinimally/how/index.page-vue-render.js index 2aa37eb160..dbe026369a 100644 --- a/book/documentation/guidelines/documentMinimally/how/index.page-vue-render.js +++ b/book/documentation/guidelines/documentMinimally/how/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can write minimal yet sufficient documentation")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Guidelines → Minimal but Sufficient →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Anything that is already clear in the code need not be described in words. Instead, "),_c('strong',[_v("focus on providing higher level information that is not readily visible in the code or comments")]),_v(".")]),_v(" "),_c('p',[_v("Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, "),_c('strong',[_v("describe the similarities in one place and emphasize only the differences in other places.")]),_v(" It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/documentMinimally/index.html b/book/documentation/guidelines/documentMinimally/index.html index ba76fd4aa0..122dabc643 100644 --- a/book/documentation/guidelines/documentMinimally/index.html +++ b/book/documentation/guidelines/documentMinimally/index.html @@ -13,7 +13,7 @@

    Implementation → Documentation → Guidelines → -

    Guideline: Document minimally, but sufficiently

    What

    Can explain that documentation should be minimal yet sufficient

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.

    How

    Can write minimal yet sufficient documentation

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Guideline: Document minimally, but sufficiently

    What

    Can explain that documentation should be minimal yet sufficient

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.

    How

    Can write minimal yet sufficient documentation

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/documentMinimally/index.page-vue-render.js b/book/documentation/guidelines/documentMinimally/index.page-vue-render.js index 8385d9bac1..07760c0e96 100644 --- a/book/documentation/guidelines/documentMinimally/index.page-vue-render.js +++ b/book/documentation/guidelines/documentMinimally/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-document-minimally-but-sufficiently"}},[_c('span',[_v("Guideline: Document minimally, but sufficiently")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-document-minimally-but-sufficiently","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/documentMinimally/what/index.html b/book/documentation/guidelines/documentMinimally/what/index.html index 6b2fb2ba72..931588d6cb 100644 --- a/book/documentation/guidelines/documentMinimally/what/index.html +++ b/book/documentation/guidelines/documentMinimally/what/index.html @@ -13,7 +13,7 @@

    Can explain that documentation should be minimal yet sufficient

    Implementation → Documentation → Guidelines → Minimal but Sufficient → -

    What

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/documentMinimally/what/index.page-vue-render.js b/book/documentation/guidelines/documentMinimally/what/index.page-vue-render.js index 129bce1ba8..ef20ded01c 100644 --- a/book/documentation/guidelines/documentMinimally/what/index.page-vue-render.js +++ b/book/documentation/guidelines/documentMinimally/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain that documentation should be minimal yet sufficient")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Guidelines → Minimal but Sufficient →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Aim for 'just enough' developer documentation.")])]),_v(" "),_c('ul',[_c('li',[_v("Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.")]),_v(" "),_c('li',[_v("If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.")])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/goTopDown/how/index.html b/book/documentation/guidelines/goTopDown/how/index.html index 952536c13d..758ed58959 100644 --- a/book/documentation/guidelines/goTopDown/how/index.html +++ b/book/documentation/guidelines/goTopDown/how/index.html @@ -18,7 +18,7 @@ And this is how FrontEnd and BackEnd work together ...

    [Now you can drill down to FrontEnd's details.]

    FrontEnd consists of three major components: A, B, C

    A's job is to ...
    B's job is to...
    C's job is to...

    And this is how the three components work together ...

    [At this point, further drill down to the internal workings of each component. A reader who is not interested in knowing the nitty-gritty details can skip ahead to the section on BackEnd.]

    In-depth description of A

    In-depth description of B

    -...

    [At this point drill down to the details of the BackEnd.]

    ...

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    [At this point drill down to the details of the BackEnd.]

    ...

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/goTopDown/how/index.page-vue-render.js b/book/documentation/guidelines/goTopDown/how/index.page-vue-render.js index 2938526697..62f46f23a2 100644 --- a/book/documentation/guidelines/goTopDown/how/index.page-vue-render.js +++ b/book/documentation/guidelines/goTopDown/how/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/goTopDown/index.html b/book/documentation/guidelines/goTopDown/index.html index 30299e92c7..f071e26477 100644 --- a/book/documentation/guidelines/goTopDown/index.html +++ b/book/documentation/guidelines/goTopDown/index.html @@ -18,7 +18,7 @@ And this is how FrontEnd and BackEnd work together ...

    [Now you can drill down to FrontEnd's details.]

    FrontEnd consists of three major components: A, B, C

    A's job is to ...
    B's job is to...
    C's job is to...

    And this is how the three components work together ...

    [At this point, further drill down to the internal workings of each component. A reader who is not interested in knowing the nitty-gritty details can skip ahead to the section on BackEnd.]

    In-depth description of A

    In-depth description of B

    -...

    [At this point drill down to the details of the BackEnd.]

    ...


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    [At this point drill down to the details of the BackEnd.]

    ...


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/goTopDown/index.page-vue-render.js b/book/documentation/guidelines/goTopDown/index.page-vue-render.js index 987842863a..5acdc7e6c6 100644 --- a/book/documentation/guidelines/goTopDown/index.page-vue-render.js +++ b/book/documentation/guidelines/goTopDown/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guideline-go-top-down-not-bottom-up"}},[_c('span',[_v("Guideline: Go top-down, not bottom-up")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guideline-go-top-down-not-bottom-up","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/goTopDown/what/index.html b/book/documentation/guidelines/goTopDown/what/index.html index 7ace872bc4..e75ee896e7 100644 --- a/book/documentation/guidelines/goTopDown/what/index.html +++ b/book/documentation/guidelines/goTopDown/what/index.html @@ -13,7 +13,7 @@ +

    What

    When writing project documents, a top-down breadth-first explanation is easier to understand than a bottom-up one.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/goTopDown/what/index.page-vue-render.js b/book/documentation/guidelines/goTopDown/what/index.page-vue-render.js index 64b194315a..e0ab369887 100644 --- a/book/documentation/guidelines/goTopDown/what/index.page-vue-render.js +++ b/book/documentation/guidelines/goTopDown/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can distinguish between top-down and bottom-up documentation")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Guidelines → Describe Top-Down →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("When writing project documents, a top-down breadth-first explanation is easier to understand than a bottom-up one.")])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/goTopDown/why/index.html b/book/documentation/guidelines/goTopDown/why/index.html index 8c3497d874..7ad7aa1cf0 100644 --- a/book/documentation/guidelines/goTopDown/why/index.html +++ b/book/documentation/guidelines/goTopDown/why/index.html @@ -13,7 +13,7 @@

    Can explain the advantages of top-down documentation

    Implementation → Documentation → Guidelines → Describe Top-Down → -

    Why

    The main advantage of the top-down approach is that the document is structured like an upside down tree (root at the top) and the reader can travel down a path she is interested in until she reaches the component she is interested to learn in-depth, without having to read the entire document or understand the whole system.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Why

    The main advantage of the top-down approach is that the document is structured like an upside down tree (root at the top) and the reader can travel down a path she is interested in until she reaches the component she is interested to learn in-depth, without having to read the entire document or understand the whole system.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/goTopDown/why/index.page-vue-render.js b/book/documentation/guidelines/goTopDown/why/index.page-vue-render.js index fccf1a0f11..cc088f272a 100644 --- a/book/documentation/guidelines/goTopDown/why/index.page-vue-render.js +++ b/book/documentation/guidelines/goTopDown/why/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain the advantages of top-down documentation")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Guidelines → Describe Top-Down →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"why"}},[_c('span',[_v("Why")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#why","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("The main advantage of the top-down approach is that the document is structured like an upside down tree (root at the top) and "),_c('strong',[_v("the reader can travel down a path she is interested in until she reaches the component she is interested to learn in-depth")]),_v(", without having to read the entire document or understand the whole system.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/guidelines/index.html b/book/documentation/guidelines/index.html index 9ec4cded59..0e3e391e45 100644 --- a/book/documentation/guidelines/index.html +++ b/book/documentation/guidelines/index.html @@ -18,7 +18,7 @@ And this is how FrontEnd and BackEnd work together ...

    [Now you can drill down to FrontEnd's details.]

    FrontEnd consists of three major components: A, B, C

    A's job is to ...
    B's job is to...
    C's job is to...

    And this is how the three components work together ...

    [At this point, further drill down to the internal workings of each component. A reader who is not interested in knowing the nitty-gritty details can skip ahead to the section on BackEnd.]

    In-depth description of A

    In-depth description of B

    -...

    [At this point drill down to the details of the BackEnd.]

    ...



    Guideline: Aim for comprehensibility

    What

    Can explain the need for comprehensibility in documents

    Technical documents exist to help others understand technical details. Therefore, it is not enough for the documentation to be accurate and comprehensive; it should also be comprehensible.


    How

    Can write reasonably comprehensible developer documents

    Here are some tips on writing effective documentation.

    • Use plenty of diagrams: It is not enough to explain something in words; complement it with visual illustrations (e.g. a UML diagram).
    • Use plenty of examples: When explaining algorithms, show a running example to illustrate each step of the algorithm, in parallel to worded explanations.
    • Use simple and direct explanations: Convoluted explanations and fancy words will annoy readers. Avoid long sentences.
    • Get rid of statements that do not add value: For example, 'We made sure our system works perfectly' (who didn't?), 'Component X has its own responsibilities' (of course it has!).
    • It is not a good idea to have separate sections for each type of artifact, such as 'use cases', 'sequence diagrams', 'activity diagrams', etc. Such a structure, coupled with the indiscriminate inclusion of diagrams without justifying their need, indicates a failure to understand the purpose of documentation. Include diagrams when they are needed to explain something. If you want to provide additional diagrams for completeness' sake, include them in the appendix as a reference.

    Exercises:

    Statements about documentation




    Guideline: Document minimally, but sufficiently

    What

    Can explain that documentation should be minimal yet sufficient

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.

    How

    Can write minimal yet sufficient documentation

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    [At this point drill down to the details of the BackEnd.]

    ...



    Guideline: Aim for comprehensibility

    What

    Can explain the need for comprehensibility in documents

    Technical documents exist to help others understand technical details. Therefore, it is not enough for the documentation to be accurate and comprehensive; it should also be comprehensible.


    How

    Can write reasonably comprehensible developer documents

    Here are some tips on writing effective documentation.

    • Use plenty of diagrams: It is not enough to explain something in words; complement it with visual illustrations (e.g. a UML diagram).
    • Use plenty of examples: When explaining algorithms, show a running example to illustrate each step of the algorithm, in parallel to worded explanations.
    • Use simple and direct explanations: Convoluted explanations and fancy words will annoy readers. Avoid long sentences.
    • Get rid of statements that do not add value: For example, 'We made sure our system works perfectly' (who didn't?), 'Component X has its own responsibilities' (of course it has!).
    • It is not a good idea to have separate sections for each type of artifact, such as 'use cases', 'sequence diagrams', 'activity diagrams', etc. Such a structure, coupled with the indiscriminate inclusion of diagrams without justifying their need, indicates a failure to understand the purpose of documentation. Include diagrams when they are needed to explain something. If you want to provide additional diagrams for completeness' sake, include them in the appendix as a reference.

    Exercises:

    Statements about documentation




    Guideline: Document minimally, but sufficiently

    What

    Can explain that documentation should be minimal yet sufficient

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.

    How

    Can write minimal yet sufficient documentation

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/guidelines/index.page-vue-render.js b/book/documentation/guidelines/index.page-vue-render.js index 357c967611..7d2d00245c 100644 --- a/book/documentation/guidelines/index.page-vue-render.js +++ b/book/documentation/guidelines/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"guidelines"}},[_c('span',[_v("Guidelines")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/index.html b/book/documentation/index.html index d58ffa3407..41009f88d0 100644 --- a/book/documentation/index.html +++ b/book/documentation/index.html @@ -172,7 +172,7 @@ -

    Resources:


    Markdown

    What

    Can explain Markdown

    Markdown is a lightweight markup language with plain text formatting syntax.


    How

    Can write documents in Markdown format



    AsciiDoc

    What

    Can explain AsciiDoc

    AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:


    Markdown

    What

    Can explain Markdown

    Markdown is a lightweight markup language with plain text formatting syntax.


    How

    Can write documents in Markdown format



    AsciiDoc

    What

    Can explain AsciiDoc

    AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/index.page-vue-render.js b/book/documentation/index.page-vue-render.js index bb62091c97..f119acbf3d 100644 --- a/book/documentation/index.page-vue-render.js +++ b/book/documentation/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"documentation"}},[_c('span',[_v("Documentation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/introduction/index.html b/book/documentation/introduction/index.html index f216a685bf..e9bd4c9847 100644 --- a/book/documentation/introduction/index.html +++ b/book/documentation/introduction/index.html @@ -16,7 +16,7 @@

    Introduction

    What

    Can explain the two types of developer docs

    Developer-to-developer documentation can be in one of two forms:

    1. Documentation for developer-as-user: Software components are written by developers and reused by other developers, which means there is a need to document how such components are to be used. Such documentation can take several forms:
      • API documentation: APIs expose functionality in small-sized, independent and easy-to-use chunks, each of which can be documented systematically.
      • Tutorial-style instructional documentation: In addition to explaining functions/methods independently, some higher-level explanations of how to use an API can be useful.
    1. Documentation for developer-as-maintainer: There is a need to document how a system or a component is designed, implemented and tested so that other developers can maintain and evolve the code. Writing documentation of this type is harder because of the need to explain complex internal details. However, given that readers of this type of documentation usually have access to the source code itself, only some information needs to be included in the documentation, as code (and code comments) can also serve as a complementary source of information.

    Another view proposed by Daniele Procida in this article is as follows:

    There is a secret that needs to be understood in order to write good software documentation: there isn’t one thing called documentation, there are four. They are: tutorials, how-to guides, explanation and technical reference. They represent four different purposes or functions, and require four different approaches to their creation. Understanding the implications of this will help improve most software documentation - often immensely. -...

    TUTORIALS

    A tutorial:

    • is learning-oriented
    • allows the newcomer to get started
    • is a lesson

    Analogy: teaching a small child how to cook

    HOW-TO GUIDES

    A how-to guide:

    • is goal-oriented
    • shows how to solve a specific problem
    • is a series of steps

    Analogy: a recipe in a cookery book

    EXPLANATION

    An explanation:

    • is understanding-oriented
    • explains
    • provides background and context

    Analogy: an article on culinary social history

    REFERENCE

    A reference guide:

    • is information-oriented
    • describes the machinery
    • is accurate and complete

    Analogy: a reference encyclopedia article

    Software documentation (applies to both user-facing and developer-facing) is best kept in a text format for ease of version tracking. A writer-friendly source format is also desirable as non-programmers (e.g., technical writers) may need to author/edit such documents. As a result, formats such as Markdown, AsciiDoc, and PlantUML are often used for software documentation.


    Exercises:

    Statements about API documentation



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    TUTORIALS

    A tutorial:

    • is learning-oriented
    • allows the newcomer to get started
    • is a lesson

    Analogy: teaching a small child how to cook

    HOW-TO GUIDES

    A how-to guide:

    • is goal-oriented
    • shows how to solve a specific problem
    • is a series of steps

    Analogy: a recipe in a cookery book

    EXPLANATION

    An explanation:

    • is understanding-oriented
    • explains
    • provides background and context

    Analogy: an article on culinary social history

    REFERENCE

    A reference guide:

    • is information-oriented
    • describes the machinery
    • is accurate and complete

    Analogy: a reference encyclopedia article

    Software documentation (applies to both user-facing and developer-facing) is best kept in a text format for ease of version tracking. A writer-friendly source format is also desirable as non-programmers (e.g., technical writers) may need to author/edit such documents. As a result, formats such as Markdown, AsciiDoc, and PlantUML are often used for software documentation.


    Exercises:

    Statements about API documentation



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/introduction/index.page-vue-render.js b/book/documentation/introduction/index.page-vue-render.js index 5b6b099449..277f6c26c5 100644 --- a/book/documentation/introduction/index.page-vue-render.js +++ b/book/documentation/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/introduction/what/index.html b/book/documentation/introduction/what/index.html index dc9a0e0654..5fd2d31b18 100644 --- a/book/documentation/introduction/what/index.html +++ b/book/documentation/introduction/what/index.html @@ -16,7 +16,7 @@

    What

    Developer-to-developer documentation can be in one of two forms:

    1. Documentation for developer-as-user: Software components are written by developers and reused by other developers, which means there is a need to document how such components are to be used. Such documentation can take several forms:
      • API documentation: APIs expose functionality in small-sized, independent and easy-to-use chunks, each of which can be documented systematically.
      • Tutorial-style instructional documentation: In addition to explaining functions/methods independently, some higher-level explanations of how to use an API can be useful.
    1. Documentation for developer-as-maintainer: There is a need to document how a system or a component is designed, implemented and tested so that other developers can maintain and evolve the code. Writing documentation of this type is harder because of the need to explain complex internal details. However, given that readers of this type of documentation usually have access to the source code itself, only some information needs to be included in the documentation, as code (and code comments) can also serve as a complementary source of information.

    Another view proposed by Daniele Procida in this article is as follows:

    There is a secret that needs to be understood in order to write good software documentation: there isn’t one thing called documentation, there are four. They are: tutorials, how-to guides, explanation and technical reference. They represent four different purposes or functions, and require four different approaches to their creation. Understanding the implications of this will help improve most software documentation - often immensely. -...

    TUTORIALS

    A tutorial:

    • is learning-oriented
    • allows the newcomer to get started
    • is a lesson

    Analogy: teaching a small child how to cook

    HOW-TO GUIDES

    A how-to guide:

    • is goal-oriented
    • shows how to solve a specific problem
    • is a series of steps

    Analogy: a recipe in a cookery book

    EXPLANATION

    An explanation:

    • is understanding-oriented
    • explains
    • provides background and context

    Analogy: an article on culinary social history

    REFERENCE

    A reference guide:

    • is information-oriented
    • describes the machinery
    • is accurate and complete

    Analogy: a reference encyclopedia article

    Software documentation (applies to both user-facing and developer-facing) is best kept in a text format for ease of version tracking. A writer-friendly source format is also desirable as non-programmers (e.g., technical writers) may need to author/edit such documents. As a result, formats such as Markdown, AsciiDoc, and PlantUML are often used for software documentation.


    Exercises:

    Statements about API documentation


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    TUTORIALS

    A tutorial:

    • is learning-oriented
    • allows the newcomer to get started
    • is a lesson

    Analogy: teaching a small child how to cook

    HOW-TO GUIDES

    A how-to guide:

    • is goal-oriented
    • shows how to solve a specific problem
    • is a series of steps

    Analogy: a recipe in a cookery book

    EXPLANATION

    An explanation:

    • is understanding-oriented
    • explains
    • provides background and context

    Analogy: an article on culinary social history

    REFERENCE

    A reference guide:

    • is information-oriented
    • describes the machinery
    • is accurate and complete

    Analogy: a reference encyclopedia article

    Software documentation (applies to both user-facing and developer-facing) is best kept in a text format for ease of version tracking. A writer-friendly source format is also desirable as non-programmers (e.g., technical writers) may need to author/edit such documents. As a result, formats such as Markdown, AsciiDoc, and PlantUML are often used for software documentation.


    Exercises:

    Statements about API documentation


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/introduction/what/index.page-vue-render.js b/book/documentation/introduction/what/index.page-vue-render.js index 1f4f05a213..98fe04a79d 100644 --- a/book/documentation/introduction/what/index.page-vue-render.js +++ b/book/documentation/introduction/what/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_c('strong',[_v("Software documentation (applies to bo with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/asciiDoc/index.html b/book/documentation/tools/asciiDoc/index.html index bc81c51d37..64251cf0bb 100644 --- a/book/documentation/tools/asciiDoc/index.html +++ b/book/documentation/tools/asciiDoc/index.html @@ -13,7 +13,7 @@ +

    AsciiDoc

    What

    Can explain AsciiDoc

    AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/asciiDoc/index.page-vue-render.js b/book/documentation/tools/asciiDoc/index.page-vue-render.js index 2eb9e8a827..4169960192 100644 --- a/book/documentation/tools/asciiDoc/index.page-vue-render.js +++ b/book/documentation/tools/asciiDoc/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"asciidoc"}},[_c('span',[_v("AsciiDoc")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#asciidoc","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/asciiDoc/what/index.html b/book/documentation/tools/asciiDoc/what/index.html index 18e1b9ed94..a8279a0065 100644 --- a/book/documentation/tools/asciiDoc/what/index.html +++ b/book/documentation/tools/asciiDoc/what/index.html @@ -13,7 +13,7 @@ +

    What

    AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/asciiDoc/what/index.page-vue-render.js b/book/documentation/tools/asciiDoc/what/index.page-vue-render.js index 94749da5c4..3c3ea0fb4c 100644 --- a/book/documentation/tools/asciiDoc/what/index.page-vue-render.js +++ b/book/documentation/tools/asciiDoc/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain AsciiDoc")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Tools → AsciiDoc →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://asciidoctor.org/docs/asciidoc-writers-guide/"}},[_v("AsciiDoc Writers Guide")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("-- from Asciidoctor.org")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/index.html b/book/documentation/tools/index.html index 92aa26c0f8..b3922a0537 100644 --- a/book/documentation/tools/index.html +++ b/book/documentation/tools/index.html @@ -165,7 +165,7 @@ -

    Resources:


    Markdown

    What

    Can explain Markdown

    Markdown is a lightweight markup language with plain text formatting syntax.


    How

    Can write documents in Markdown format



    AsciiDoc

    What

    Can explain AsciiDoc

    AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:


    Markdown

    What

    Can explain Markdown

    Markdown is a lightweight markup language with plain text formatting syntax.


    How

    Can write documents in Markdown format



    AsciiDoc

    What

    Can explain AsciiDoc

    AsciiDoc is similar to Markdown but has more powerful (and also more complex) syntax.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/index.page-vue-render.js b/book/documentation/tools/index.page-vue-render.js index d125dde682..bee4fd47ca 100644 --- a/book/documentation/tools/index.page-vue-render.js +++ b/book/documentation/tools/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"tools"}},[_c('span',[_v("Tools")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tools","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/javaDoc/how/index.html b/book/documentation/tools/javaDoc/how/index.html index 3d86200085..5b0b0f308e 100644 --- a/book/documentation/tools/javaDoc/how/index.html +++ b/book/documentation/tools/javaDoc/how/index.html @@ -108,7 +108,7 @@ -

    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/javaDoc/how/index.page-vue-render.js b/book/documentation/tools/javaDoc/how/index.page-vue-render.js index 89799f3630..92b32f5642 100644 --- a/book/documentation/tools/javaDoc/how/index.page-vue-render.js +++ b/book/documentation/tools/javaDoc/how/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}}, with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.tutorialspoint.com/java/java_documentation.htm"}},[_v("A short tutorial on writing JavaDoc comments")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("-- from tutorialspoint.com")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://docs.oracle.com/en/java/javase/11/tools/javadoc.html"}},[_v("A more detailed description")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("-- from Oracle")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/javaDoc/index.html b/book/documentation/tools/javaDoc/index.html index 3f83eb2a52..b0fd4c0342 100644 --- a/book/documentation/tools/javaDoc/index.html +++ b/book/documentation/tools/javaDoc/index.html @@ -165,7 +165,7 @@ -

    Resources:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/javaDoc/index.page-vue-render.js b/book/documentation/tools/javaDoc/index.page-vue-render.js index 92704724cf..be2bbae5c8 100644 --- a/book/documentation/tools/javaDoc/index.page-vue-render.js +++ b/book/documentation/tools/javaDoc/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"javadoc"}},[_c('span',[_v("JavaDoc")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#javadoc","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/javaDoc/what/index.html b/book/documentation/tools/javaDoc/what/index.html index d1b3be649e..46af5a311c 100644 --- a/book/documentation/tools/javaDoc/what/index.html +++ b/book/documentation/tools/javaDoc/what/index.html @@ -70,7 +70,7 @@ -

    Generated HTML documentation:

    Tooltip generated by IntelliJ IDE:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Generated HTML documentation:

    Tooltip generated by IntelliJ IDE:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/javaDoc/what/index.page-vue-render.js b/book/documentation/tools/javaDoc/what/index.page-vue-render.js index eed0f831f6..c2a59f7eca 100644 --- a/book/documentation/tools/javaDoc/what/index.page-vue-render.js +++ b/book/documentation/tools/javaDoc/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("JavaDoc is a tool for generating API documentation in HTML format from comments in the source code.")]),_v(" In addition, modern IDEs use JavaDoc comments to generate explanatory tooltips.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/markdown/how/index.html b/book/documentation/tools/markdown/how/index.html index 044625ab92..a15a4ed196 100644 --- a/book/documentation/tools/markdown/how/index.html +++ b/book/documentation/tools/markdown/how/index.html @@ -13,7 +13,7 @@ +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/markdown/how/index.page-vue-render.js b/book/documentation/tools/markdown/how/index.page-vue-render.js index 4e447c6341..3735143c86 100644 --- a/book/documentation/tools/markdown/how/index.page-vue-render.js +++ b/book/documentation/tools/markdown/how/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can write documents in Markdown format")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Tools → Markdown →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://guides.github.com/features/mastering-markdown/"}},[_v("A tutorial on "),_c('em',[_v("Mastering Markdown")])]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("-- from GitHub")])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/markdown/index.html b/book/documentation/tools/markdown/index.html index 5a5ff4f4bf..2433780e1b 100644 --- a/book/documentation/tools/markdown/index.html +++ b/book/documentation/tools/markdown/index.html @@ -13,7 +13,7 @@ +

    Markdown

    What

    Can explain Markdown

    Markdown is a lightweight markup language with plain text formatting syntax.


    How

    Can write documents in Markdown format


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/markdown/index.page-vue-render.js b/book/documentation/tools/markdown/index.page-vue-render.js index 4e58136f74..6c4aaa50f9 100644 --- a/book/documentation/tools/markdown/index.page-vue-render.js +++ b/book/documentation/tools/markdown/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"markdown"}},[_c('span',[_v("Markdown")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#markdown","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/documentation/tools/markdown/what/index.html b/book/documentation/tools/markdown/what/index.html index c1d4a1ba7b..126bfc3444 100644 --- a/book/documentation/tools/markdown/what/index.html +++ b/book/documentation/tools/markdown/what/index.html @@ -13,7 +13,7 @@ +

    What

    Markdown is a lightweight markup language with plain text formatting syntax.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/documentation/tools/markdown/what/index.page-vue-render.js b/book/documentation/tools/markdown/what/index.page-vue-render.js index 4efee25885..5ccd97d48a 100644 --- a/book/documentation/tools/markdown/what/index.page-vue-render.js +++ b/book/documentation/tools/markdown/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain Markdown")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Documentation → Tools → Markdown →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Markdown is a lightweight markup language with plain text formatting syntax.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/assertions/how/index.html b/book/errorHandling/assertions/how/index.html index 03d6f7dfcc..f5f8d33b8a 100644 --- a/book/errorHandling/assertions/how/index.html +++ b/book/errorHandling/assertions/how/index.html @@ -51,7 +51,7 @@ -

    Assertions can be disabled without modifying the code.

    java -enableassertions HelloWorld (or java -ea HelloWorld) will run HelloWorld with assertions enabled while java -disableassertions HelloWorld will run it without verifying assertions.

    Java disables assertions by default. This could create a situation where you think all assertions are being verified as true while in fact they are not being verified at all. Therefore, remember to enable assertions when you run the program if you want them to be in effect.

    Enable assertions in IntelliJ (how?) and get an assertion to fail temporarily (e.g. insert an assert false into the code temporarily) to confirm assertions are being verified.

    Java assert vs JUnit assertions: Both check for a given condition but JUnit assertions are more powerful and customized for testing. In addition, JUnit assertions are not disabled by default. Use JUnit assertions in test code and Java assert in functional code.


    Resources:

    Tutorials:

    Best practices:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Assertions can be disabled without modifying the code.

    java -enableassertions HelloWorld (or java -ea HelloWorld) will run HelloWorld with assertions enabled while java -disableassertions HelloWorld will run it without verifying assertions.

    Java disables assertions by default. This could create a situation where you think all assertions are being verified as true while in fact they are not being verified at all. Therefore, remember to enable assertions when you run the program if you want them to be in effect.

    Enable assertions in IntelliJ (how?) and get an assertion to fail temporarily (e.g. insert an assert false into the code temporarily) to confirm assertions are being verified.

    Java assert vs JUnit assertions: Both check for a given condition but JUnit assertions are more powerful and customized for testing. In addition, JUnit assertions are not disabled by default. Use JUnit assertions in test code and Java assert in functional code.


    Resources:

    Tutorials:

    Best practices:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/assertions/how/index.page-vue-render.js b/book/errorHandling/assertions/how/index.page-vue-render.js index a583eac954..d99a0ef354 100644 --- a/book/errorHandling/assertions/how/index.page-vue-render.js +++ b/book/errorHandling/assertions/how/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle" with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('p',[_c('strong',[_v("Tutorials")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.javatpoint.com/assertion-in-java"}},[_c('strong',[_v("Java Assertions")])]),_v(" -- a simple tutorial from "),_c('em',[_v("javatpoint.com")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html"}},[_c('strong',[_v("Programming with Assertions")]),_v(" (first half)")]),_v(" -- a more detailed tutorial from "),_c('em',[_v("Oracle")])])]),_v(" "),_c('p',[_c('strong',[_v("Best practices")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"http://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#usage"}},[_c('strong',[_v("Programming with Assertions")]),_v(" (second half)")]),_v(" -- "),_c('em',[_v("from Oracle")]),_v(" (also listed above as a tutorial) contains some best practices towards the end of the article.")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/assertions/index.html b/book/errorHandling/assertions/index.html index 0082850c6e..59d42df67f 100644 --- a/book/errorHandling/assertions/index.html +++ b/book/errorHandling/assertions/index.html @@ -126,7 +126,7 @@

    Assertions are suitable for verifying assumptions about Internal Invariants, Control-Flow Invariants, -Preconditions, Postconditions, and Class Invariants. Refer to Programming with Assertions (second half) to learn more.

    Exceptions and assertions are two complementary ways of handling errors in software but they serve different purposes. Therefore, both assertions and exceptions should be used in code.

    • The raising of an exception indicates an unusual condition created by the user (e.g. user inputs an unacceptable input) or the environment (e.g., a file needed for the program is missing).
    • An assertion failure indicates the programmer made a mistake in the code (e.g., a null value is returned from a method that is not supposed to return null under any circumstances).

    Exercises:

    Assertion failure in Calculator


    Statement about exceptions and assertions



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Preconditions, Postconditions, and Class Invariants. Refer to Programming with Assertions (second half) to learn more.

    Exceptions and assertions are two complementary ways of handling errors in software but they serve different purposes. Therefore, both assertions and exceptions should be used in code.

    • The raising of an exception indicates an unusual condition created by the user (e.g. user inputs an unacceptable input) or the environment (e.g., a file needed for the program is missing).
    • An assertion failure indicates the programmer made a mistake in the code (e.g., a null value is returned from a method that is not supposed to return null under any circumstances).

    Exercises:

    Assertion failure in Calculator


    Statement about exceptions and assertions



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/assertions/index.page-vue-render.js b/book/errorHandling/assertions/index.page-vue-render.js index 4433a0ee8c..8258684747 100644 --- a/book/errorHandling/assertions/index.page-vue-render.js +++ b/book/errorHandling/assertions/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"assertions"}},[_c('span',[_v("Assertions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#assertions","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/assertions/what/index.html b/book/errorHandling/assertions/what/index.html index 66eb3ec473..a6cf3d20f9 100644 --- a/book/errorHandling/assertions/what/index.html +++ b/book/errorHandling/assertions/what/index.html @@ -50,7 +50,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/assertions/what/index.page-vue-render.js b/book/errorHandling/assertions/what/index.page-vue-render.js index db2ce704cc..4fcf6a7295 100644 --- a/book/errorHandling/assertions/what/index.page-vue-render.js +++ b/book/errorHandling/assertions/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Assertions")]),_v(" are used with(this){return _c('p',[_c('strong',[_v("If the runtime detects an "),_c('em',[_v("assertion failure")]),_v(", it typically takes some drastic action")]),_v(" such as terminating the execution with an error message. This is because an assertion failure indicates a possible bug and the sooner the execution stops, the safer it is.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/assertions/when/index.html b/book/errorHandling/assertions/when/index.html index 6e2f349b03..ca273bf928 100644 --- a/book/errorHandling/assertions/when/index.html +++ b/book/errorHandling/assertions/when/index.html @@ -51,7 +51,7 @@

    Assertions are suitable for verifying assumptions about Internal Invariants, Control-Flow Invariants, -Preconditions, Postconditions, and Class Invariants. Refer to Programming with Assertions (second half) to learn more.

    Exceptions and assertions are two complementary ways of handling errors in software but they serve different purposes. Therefore, both assertions and exceptions should be used in code.

    • The raising of an exception indicates an unusual condition created by the user (e.g. user inputs an unacceptable input) or the environment (e.g., a file needed for the program is missing).
    • An assertion failure indicates the programmer made a mistake in the code (e.g., a null value is returned from a method that is not supposed to return null under any circumstances).

    Exercises:

    Assertion failure in Calculator


    Statement about exceptions and assertions


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Preconditions, Postconditions, and Class Invariants. Refer to Programming with Assertions (second half) to learn more.

    Exceptions and assertions are two complementary ways of handling errors in software but they serve different purposes. Therefore, both assertions and exceptions should be used in code.

    • The raising of an exception indicates an unusual condition created by the user (e.g. user inputs an unacceptable input) or the environment (e.g., a file needed for the program is missing).
    • An assertion failure indicates the programmer made a mistake in the code (e.g., a null value is returned from a method that is not supposed to return null under any circumstances).

    Exercises:

    Assertion failure in Calculator


    Statement about exceptions and assertions


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/assertions/when/index.page-vue-render.js b/book/errorHandling/assertions/when/index.page-vue-render.js index b5605b63ec..65cf4ff84f 100644 --- a/book/errorHandling/assertions/when/index.page-vue-render.js +++ b/book/errorHandling/assertions/when/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('ul',[_c('li',[_v("The raising of an exception indicates an with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/defensiveProgramming/1to1Associations/index.html b/book/errorHandling/defensiveProgramming/1to1Associations/index.html index d7f178a9b3..9ae805693e 100644 --- a/book/errorHandling/defensiveProgramming/1to1Associations/index.html +++ b/book/errorHandling/defensiveProgramming/1to1Associations/index.html @@ -102,7 +102,7 @@ -

    Option 2 is more defensive because the Mine is immediately linked to a MinedCell.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Option 2 is more defensive because the Mine is immediately linked to a MinedCell.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/defensiveProgramming/1to1Associations/index.page-vue-render.js b/book/errorHandling/defensiveProgramming/1to1Associations/index.page-vue-render.js index 52adfd2ab9..2024623a64 100644 --- a/book/errorHandling/defensiveProgramming/1to1Associations/index.page-vue-render.js +++ b/book/errorHandling/defensiveProgramming/1to1Associations/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}}, with(this){return _c('p',[_v("Option 2 is more defensive because the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Mine")]),_v(" is immediately linked to a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MinedCell")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.html b/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.html index 5e21ea8487..3b32268490 100644 --- a/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.html +++ b/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.html @@ -146,7 +146,7 @@ -

    Exercises:

    Write a Manager#addAccount()


    Implement Marriage


    Immutable Account class


    Is this defensive?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exercises:

    Write a Manager#addAccount()


    Implement Marriage


    Immutable Account class


    Is this defensive?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.page-vue-render.js b/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.page-vue-render.js index ace2edd5c1..6dba676efb 100644 --- a/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.page-vue-render.js +++ b/book/errorHandling/defensiveProgramming/compulsoryAssociations/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_v("Consider two classes, "),_c('code',{pre:true,attrs with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/defensiveProgramming/index.html b/book/errorHandling/defensiveProgramming/index.html index 690d96b18b..0ec2008d65 100644 --- a/book/errorHandling/defensiveProgramming/index.html +++ b/book/errorHandling/defensiveProgramming/index.html @@ -593,7 +593,7 @@ -

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?



    When

    Can explain when to use defensive programming

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?



    When

    Can explain when to use defensive programming

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/defensiveProgramming/index.page-vue-render.js b/book/errorHandling/defensiveProgramming/index.page-vue-render.js index 4b20c69a54..a09fd18beb 100644 --- a/book/errorHandling/defensiveProgramming/index.page-vue-render.js +++ b/book/errorHandling/defensiveProgramming/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"defensive-programming"}},[_c('span',[_v("Defensive programming")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#defensive-programming","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/defensiveProgramming/referentialIntegrity/index.html b/book/errorHandling/defensiveProgramming/referentialIntegrity/index.html index ad025501cc..76eae0370e 100644 --- a/book/errorHandling/defensiveProgramming/referentialIntegrity/index.html +++ b/book/errorHandling/defensiveProgramming/referentialIntegrity/index.html @@ -289,7 +289,7 @@ -

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/defensiveProgramming/referentialIntegrity/index.page-vue-render.js b/book/errorHandling/defensiveProgramming/referentialIntegrity/index.page-vue-render.js index 5385039f08..367d0e0cb8 100644 --- a/book/errorHandling/defensiveProgramming/referentialIntegrity/index.page-vue-render.js +++ b/book/errorHandling/defensiveProgramming/referentialIntegrity/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_v("When "),_c('code',{pre:true,attrs:{"class":"line-n with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/defensiveProgramming/what/index.html b/book/errorHandling/defensiveProgramming/what/index.html index cba2f2c28a..f4adf6f8f1 100644 --- a/book/errorHandling/defensiveProgramming/what/index.html +++ b/book/errorHandling/defensiveProgramming/what/index.html @@ -95,7 +95,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/defensiveProgramming/what/index.page-vue-render.js b/book/errorHandling/defensiveProgramming/what/index.page-vue-render.js index 800f560646..cd6a905740 100644 --- a/book/errorHandling/defensiveProgramming/what/index.page-vue-render.js +++ b/book/errorHandling/defensiveProgramming/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("A defensive programmer codes under the assumption \"if you leave room for things to go wrong, they "),_c('em',[_v("will")]),_v(" go wrong\".")]),_v(" Therefore, a defensive programmer proactively tries to eliminate any room for things to go wrong.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/defensiveProgramming/when/index.html b/book/errorHandling/defensiveProgramming/when/index.html index 4fe0c795db..15a5e16cc2 100644 --- a/book/errorHandling/defensiveProgramming/when/index.html +++ b/book/errorHandling/defensiveProgramming/when/index.html @@ -13,7 +13,7 @@

    Can explain when to use defensive programming

    Implementation → Error Handling → Defensive Programming → -

    When

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/defensiveProgramming/when/index.page-vue-render.js b/book/errorHandling/defensiveProgramming/when/index.page-vue-render.js index 1747bb4fc5..e3b5a3f1de 100644 --- a/book/errorHandling/defensiveProgramming/when/index.page-vue-render.js +++ b/book/errorHandling/defensiveProgramming/when/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_v("It is not necessary to be 1 with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/designByContract/index.html b/book/errorHandling/designByContract/index.html index f497bf7d2b..5299e78bff 100644 --- a/book/errorHandling/designByContract/index.html +++ b/book/errorHandling/designByContract/index.html @@ -13,7 +13,7 @@

    Implementation → Error Handling → -

    Design-by-contract approach

    Design by contract

    Can explain the Design-by-Contract approach

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design-by-contract approach

    Design by contract

    Can explain the Design-by-Contract approach

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/designByContract/index.page-vue-render.js b/book/errorHandling/designByContract/index.page-vue-render.js index 8d407e0de7..138ac03158 100644 --- a/book/errorHandling/designByContract/index.page-vue-render.js +++ b/book/errorHandling/designByContract/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"design-by-contract-approach"}},[_c('span',[_v("Design-by-contract approach")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design-by-contract-approach","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/designByContract/what/index.html b/book/errorHandling/designByContract/what/index.html index 2a50d35eb9..9fae218cbf 100644 --- a/book/errorHandling/designByContract/what/index.html +++ b/book/errorHandling/designByContract/what/index.html @@ -13,7 +13,7 @@

    Can explain the Design-by-Contract approach

    Implementation → Error Handling → Design by Contract → -

    Design by contract

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design by contract

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/designByContract/what/index.page-vue-render.js b/book/errorHandling/designByContract/what/index.page-vue-render.js index d751debdfd..2de774da4c 100644 --- a/book/errorHandling/designByContract/what/index.page-vue-render.js +++ b/book/errorHandling/designByContract/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_v("Suppose an operation is implemented with the behav with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/exceptions/how/index.html b/book/errorHandling/exceptions/how/index.html index 51e07abf77..4effa6b711 100644 --- a/book/errorHandling/exceptions/how/index.html +++ b/book/errorHandling/exceptions/how/index.html @@ -13,7 +13,7 @@

    Can explain how exception handling is done typically

    Implementation → Error Handling → Exceptions → -

    How

    Most languages allow code that encountered an "exceptional" situation to encapsulate details of the situation in an Exception object and throw/raise that object so that another piece of code can catch it and deal with it. This is especially useful when the code that encountered the unusual situation does not know how to deal with it.

    The extract below from the -- Java Tutorial (with slight adaptations) explains how exceptions are typically handled.

    When an error occurs at some point in the execution, the code being executed creates an exception object and hands it off to the runtime system. The exception object contains information about the error, including its type and the state of the program when the error occurred. Creating an exception object and handing it to the runtime system is called throwing an exception.

    After a method throws an exception, the runtime system attempts to find something to handle it in the . The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler. The search begins with the method in which the error occurred and proceeds through the call stack in the reverse order in which the methods were called. When an appropriate handler is found, the runtime system passes the exception to the handler. An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler.

    The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, the program terminates.

    Advantages of exception handling in this way:

    • The ability to propagate error information through the call stack.
    • The separation of code that deals with 'unusual' situations from the code that does the 'usual' work.

    Exercises:

    Benefits of exceptions


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    Most languages allow code that encountered an "exceptional" situation to encapsulate details of the situation in an Exception object and throw/raise that object so that another piece of code can catch it and deal with it. This is especially useful when the code that encountered the unusual situation does not know how to deal with it.

    The extract below from the -- Java Tutorial (with slight adaptations) explains how exceptions are typically handled.

    When an error occurs at some point in the execution, the code being executed creates an exception object and hands it off to the runtime system. The exception object contains information about the error, including its type and the state of the program when the error occurred. Creating an exception object and handing it to the runtime system is called throwing an exception.

    After a method throws an exception, the runtime system attempts to find something to handle it in the . The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler. The search begins with the method in which the error occurred and proceeds through the call stack in the reverse order in which the methods were called. When an appropriate handler is found, the runtime system passes the exception to the handler. An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler.

    The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, the program terminates.

    Advantages of exception handling in this way:

    • The ability to propagate error information through the call stack.
    • The separation of code that deals with 'unusual' situations from the code that does the 'usual' work.

    Exercises:

    Benefits of exceptions


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/exceptions/how/index.page-vue-render.js b/book/errorHandling/exceptions/how/index.page-vue-render.js index 62ff835454..31e97737a8 100644 --- a/book/errorHandling/exceptions/how/index.page-vue-render.js +++ b/book/errorHandling/exceptions/how/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('ul',[_c('li',[_v("The ability to propagate error informati with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/exceptions/index.html b/book/errorHandling/exceptions/index.html index 9330d612e4..7b5db23739 100644 --- a/book/errorHandling/exceptions/index.html +++ b/book/errorHandling/exceptions/index.html @@ -13,7 +13,7 @@

    Implementation → Error Handling → -

    Exceptions

    What

    Can explain exceptions

    Exceptions are used to deal with 'unusual' but not entirely unexpected situations that the program might encounter at runtime.

    Exception:

    The term exception is shorthand for the phrase "exceptional event." An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. –- Java Tutorial (Oracle Inc.)

    Examples:

    • A network connection encounters a timeout due to a slow server.
    • The code tries to read a file from the hard disk but the file is corrupted and cannot be read.

    How

    Can explain how exception handling is done typically

    Most languages allow code that encountered an "exceptional" situation to encapsulate details of the situation in an Exception object and throw/raise that object so that another piece of code can catch it and deal with it. This is especially useful when the code that encountered the unusual situation does not know how to deal with it.

    The extract below from the -- Java Tutorial (with slight adaptations) explains how exceptions are typically handled.

    When an error occurs at some point in the execution, the code being executed creates an exception object and hands it off to the runtime system. The exception object contains information about the error, including its type and the state of the program when the error occurred. Creating an exception object and handing it to the runtime system is called throwing an exception.

    After a method throws an exception, the runtime system attempts to find something to handle it in the . The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler. The search begins with the method in which the error occurred and proceeds through the call stack in the reverse order in which the methods were called. When an appropriate handler is found, the runtime system passes the exception to the handler. An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler.

    The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, the program terminates.

    Advantages of exception handling in this way:

    • The ability to propagate error information through the call stack.
    • The separation of code that deals with 'unusual' situations from the code that does the 'usual' work.

    Exercises:

    Benefits of exceptions



    When

    Can avoid using exceptions to control normal workflow

    In general, use exceptions only for 'unusual' conditions. Use normal return statements to pass control to the caller for conditions that are 'normal'.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exceptions

    What

    Can explain exceptions

    Exceptions are used to deal with 'unusual' but not entirely unexpected situations that the program might encounter at runtime.

    Exception:

    The term exception is shorthand for the phrase "exceptional event." An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. –- Java Tutorial (Oracle Inc.)

    Examples:

    • A network connection encounters a timeout due to a slow server.
    • The code tries to read a file from the hard disk but the file is corrupted and cannot be read.

    How

    Can explain how exception handling is done typically

    Most languages allow code that encountered an "exceptional" situation to encapsulate details of the situation in an Exception object and throw/raise that object so that another piece of code can catch it and deal with it. This is especially useful when the code that encountered the unusual situation does not know how to deal with it.

    The extract below from the -- Java Tutorial (with slight adaptations) explains how exceptions are typically handled.

    When an error occurs at some point in the execution, the code being executed creates an exception object and hands it off to the runtime system. The exception object contains information about the error, including its type and the state of the program when the error occurred. Creating an exception object and handing it to the runtime system is called throwing an exception.

    After a method throws an exception, the runtime system attempts to find something to handle it in the . The runtime system searches the call stack for a method that contains a block of code that can handle the exception. This block of code is called an exception handler. The search begins with the method in which the error occurred and proceeds through the call stack in the reverse order in which the methods were called. When an appropriate handler is found, the runtime system passes the exception to the handler. An exception handler is considered appropriate if the type of the exception object thrown matches the type that can be handled by the handler.

    The exception handler chosen is said to catch the exception. If the runtime system exhaustively searches all the methods on the call stack without finding an appropriate exception handler, the program terminates.

    Advantages of exception handling in this way:

    • The ability to propagate error information through the call stack.
    • The separation of code that deals with 'unusual' situations from the code that does the 'usual' work.

    Exercises:

    Benefits of exceptions



    When

    Can avoid using exceptions to control normal workflow

    In general, use exceptions only for 'unusual' conditions. Use normal return statements to pass control to the caller for conditions that are 'normal'.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/exceptions/index.page-vue-render.js b/book/errorHandling/exceptions/index.page-vue-render.js index e8d2c53957..5b8430f433 100644 --- a/book/errorHandling/exceptions/index.page-vue-render.js +++ b/book/errorHandling/exceptions/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"exceptions"}},[_c('span',[_v("Exceptions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exceptions","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/exceptions/what/index.html b/book/errorHandling/exceptions/what/index.html index 4e9a31a1c3..9c63ab840f 100644 --- a/book/errorHandling/exceptions/what/index.html +++ b/book/errorHandling/exceptions/what/index.html @@ -13,7 +13,7 @@

    Can explain exceptions

    Implementation → Error Handling → Exceptions → -

    What

    Exceptions are used to deal with 'unusual' but not entirely unexpected situations that the program might encounter at runtime.

    Exception:

    The term exception is shorthand for the phrase "exceptional event." An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. –- Java Tutorial (Oracle Inc.)

    Examples:

    • A network connection encounters a timeout due to a slow server.
    • The code tries to read a file from the hard disk but the file is corrupted and cannot be read.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Exceptions are used to deal with 'unusual' but not entirely unexpected situations that the program might encounter at runtime.

    Exception:

    The term exception is shorthand for the phrase "exceptional event." An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. –- Java Tutorial (Oracle Inc.)

    Examples:

    • A network connection encounters a timeout due to a slow server.
    • The code tries to read a file from the hard disk but the file is corrupted and cannot be read.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/exceptions/what/index.page-vue-render.js b/book/errorHandling/exceptions/what/index.page-vue-render.js index 900158ab10..e4fc929758 100644 --- a/book/errorHandling/exceptions/what/index.page-vue-render.js +++ b/book/errorHandling/exceptions/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("Exceptions are used to deal with "),_c('em',[_v("'unusual' but not entirely unexpected")]),_v(" situations")]),_v(" that the program might encounter at runtime.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/exceptions/when/index.html b/book/errorHandling/exceptions/when/index.html index 2b05f9bd57..39e85bd766 100644 --- a/book/errorHandling/exceptions/when/index.html +++ b/book/errorHandling/exceptions/when/index.html @@ -13,7 +13,7 @@ +

    When

    In general, use exceptions only for 'unusual' conditions. Use normal return statements to pass control to the caller for conditions that are 'normal'.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/exceptions/when/index.page-vue-render.js b/book/errorHandling/exceptions/when/index.page-vue-render.js index 4ca05e0b82..db53619c68 100644 --- a/book/errorHandling/exceptions/when/index.page-vue-render.js +++ b/book/errorHandling/exceptions/when/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can avoid using exceptions to control normal workflow")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Error Handling → Exceptions →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"when"}},[_c('span',[_v("When")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#when","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("In general, use exceptions only for 'unusual' conditions. Use normal "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("return")]),_v(" statements to pass control to the caller for conditions that are 'normal'.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/index.html b/book/errorHandling/index.html index 1fb81b6335..477af80037 100644 --- a/book/errorHandling/index.html +++ b/book/errorHandling/index.html @@ -822,7 +822,7 @@ -

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?



    When

    Can explain when to use defensive programming

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming




    Design-by-contract approach

    Design by contract

    Can explain the Design-by-Contract approach

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?



    When

    Can explain when to use defensive programming

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming




    Design-by-contract approach

    Design by contract

    Can explain the Design-by-Contract approach

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/index.page-vue-render.js b/book/errorHandling/index.page-vue-render.js index 2b4c236968..71bda20566 100644 --- a/book/errorHandling/index.page-vue-render.js +++ b/book/errorHandling/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"error-handling"}},[_c('span',[_v("Error handling")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#error-handling","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/introduction/index.html b/book/errorHandling/introduction/index.html index cbaa03d6c4..180582655f 100644 --- a/book/errorHandling/introduction/index.html +++ b/book/errorHandling/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    What

    Can explain error handling

    Well-written applications include error-handling code that allows them to recover gracefully from unexpected errors. When an error occurs, the application may need to request user intervention, or it may be able to recover on its own. In extreme cases, the application may log the user off or shut down the system. -- Microsoft


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/introduction/index.page-vue-render.js b/book/errorHandling/introduction/index.page-vue-render.js index 48e217c407..337f4f8330 100644 --- a/book/errorHandling/introduction/index.page-vue-render.js +++ b/book/errorHandling/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/introduction/what/index.html b/book/errorHandling/introduction/what/index.html index fe9b94adf4..51987f63ec 100644 --- a/book/errorHandling/introduction/what/index.html +++ b/book/errorHandling/introduction/what/index.html @@ -13,7 +13,7 @@ +

    What

    Well-written applications include error-handling code that allows them to recover gracefully from unexpected errors. When an error occurs, the application may need to request user intervention, or it may be able to recover on its own. In extreme cases, the application may log the user off or shut down the system. -- Microsoft

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/introduction/what/index.page-vue-render.js b/book/errorHandling/introduction/what/index.page-vue-render.js index 13e57fdcd3..b5a3315cda 100644 --- a/book/errorHandling/introduction/what/index.page-vue-render.js +++ b/book/errorHandling/introduction/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain error handling")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Error Handling → Introduction →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('blockquote',[_c('p',[_v("Well-written applications include error-handling code that allows them to recover gracefully from unexpected errors. When an error occurs, the application may need to request user intervention, or it may be able to recover on its own. In extreme cases, the application may log the user off or shut down the system. -- "),_c('sub',[_c('a',{attrs:{"href":"https://docs.microsoft.com/en-my/windows/win32/debug/error-handling"}},[_v("Microsoft")])])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/logging/how/index.html b/book/errorHandling/logging/how/index.html index f7eff357a0..711ed6b318 100644 --- a/book/errorHandling/logging/how/index.html +++ b/book/errorHandling/logging/how/index.html @@ -130,7 +130,7 @@ -

    Resources:

    Tutorials:

    • A video tutorial by SimplyCoded:

    Best Practices:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:

    Tutorials:

    • A video tutorial by SimplyCoded:

    Best Practices:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/logging/how/index.page-vue-render.js b/book/errorHandling/logging/how/index.page-vue-render.js index 55fe52d7d9..cc124d2ab0 100644 --- a/book/errorHandling/logging/how/index.page-vue-render.js +++ b/book/errorHandling/logging/how/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_c('strong',[_v("Best Practices")]),_v(":")])} with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.javacodegeeks.com/2011/01/10-tips-proper-application-logging.html"}},[_c('strong',[_v("10 Tips for Proper Application Logging")])]),_v(" -- by "),_c('em',[_v("Tomasz Nurkiewicz")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"http://commons.apache.org/proper/commons-logging/guide.html#Message_PrioritiesLevels"}},[_c('strong',[_v("What each logging level means")])]),_v(" -- conventions recommended by "),_c('em',[_v("Apache Project")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/logging/index.html b/book/errorHandling/logging/index.html index 0f7e0ac5c8..b71c49ac25 100644 --- a/book/errorHandling/logging/index.html +++ b/book/errorHandling/logging/index.html @@ -130,7 +130,7 @@ -

    Resources:

    Tutorials:

    • A video tutorial by SimplyCoded:

    Best Practices:


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:

    Tutorials:

    • A video tutorial by SimplyCoded:

    Best Practices:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/logging/index.page-vue-render.js b/book/errorHandling/logging/index.page-vue-render.js index 3cf616e9f0..7c8149a0fc 100644 --- a/book/errorHandling/logging/index.page-vue-render.js +++ b/book/errorHandling/logging/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"logging"}},[_c('span',[_v("Logging")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#logging","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/errorHandling/logging/what/index.html b/book/errorHandling/logging/what/index.html index 4ff0869955..d08653a865 100644 --- a/book/errorHandling/logging/what/index.html +++ b/book/errorHandling/logging/what/index.html @@ -13,7 +13,7 @@

    Can explain logging

    Implementation → Error Handling → Logging → -

    What

    Logging is the deliberate recording of certain information during a program execution for future reference. Logs are typically written to a log file but it is also possible to log information in other ways e.g. into a database or a remote server.

    Logging can be useful for troubleshooting problems. A good logging system records some system information regularly. When bad things happen to a system e.g. an unanticipated failure, their associated log files may provide indications of what went wrong and actions can then be taken to prevent it from happening again.

    A log file is like the of an airplane; they don't prevent problems but they can be helpful in understanding what went wrong after the fact.


    Exercises:

    Logging vs blackbox


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Logging is the deliberate recording of certain information during a program execution for future reference. Logs are typically written to a log file but it is also possible to log information in other ways e.g. into a database or a remote server.

    Logging can be useful for troubleshooting problems. A good logging system records some system information regularly. When bad things happen to a system e.g. an unanticipated failure, their associated log files may provide indications of what went wrong and actions can then be taken to prevent it from happening again.

    A log file is like the of an airplane; they don't prevent problems but they can be helpful in understanding what went wrong after the fact.


    Exercises:

    Logging vs blackbox


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/errorHandling/logging/what/index.page-vue-render.js b/book/errorHandling/logging/what/index.page-vue-render.js index e2d823a840..4190f24cdd 100644 --- a/book/errorHandling/logging/what/index.page-vue-render.js +++ b/book/errorHandling/logging/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Logging")]),_v(" can be usef with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/brainstorming/index.html b/book/gatheringRequirements/brainstorming/index.html index d0d28ce924..0f5f1fc3cc 100644 --- a/book/gatheringRequirements/brainstorming/index.html +++ b/book/gatheringRequirements/brainstorming/index.html @@ -13,7 +13,7 @@

    Can explain brainstorming

    Requirements → Gathering Requirements → -

    Brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.


    Exercises:

    Characteristic of brainstorming


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.


    Exercises:

    Characteristic of brainstorming


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/brainstorming/index.page-vue-render.js b/book/gatheringRequirements/brainstorming/index.page-vue-render.js index 2e343ba4af..85bf51627c 100644 --- a/book/gatheringRequirements/brainstorming/index.page-vue-render.js +++ b/book/gatheringRequirements/brainstorming/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("In a brainstorming session there are with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/focusGroups/index.html b/book/gatheringRequirements/focusGroups/index.html index 42cfef7e24..6c115a7765 100644 --- a/book/gatheringRequirements/focusGroups/index.html +++ b/book/gatheringRequirements/focusGroups/index.html @@ -13,7 +13,7 @@ +

    Focus groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/focusGroups/index.page-vue-render.js b/book/gatheringRequirements/focusGroups/index.page-vue-render.js index 7599617af3..1269358d53 100644 --- a/book/gatheringRequirements/focusGroups/index.page-vue-render.js +++ b/book/gatheringRequirements/focusGroups/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('sub',[_v("["),_c('a',{attrs:{"href":"http://www.hanscom.af with(this){return _c('p',[_c('strong',[_v("Focus groups are a kind of informal interview within an interactive group setting.")]),_v(" A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/index.html b/book/gatheringRequirements/index.html index 5a9daccd3d..ac96d229f5 100644 --- a/book/gatheringRequirements/index.html +++ b/book/gatheringRequirements/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Gathering requirements

    Brainstorming

    Can explain brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.


    Exercises:

    Characteristic of brainstorming



    User surveys

    Can explain user surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.


    Observation

    Can explain observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.


    Interviews

    Can explain interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.


    Focus groups

    Can explain focus groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra


    Prototyping

    Can explain prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.


    Product surveys

    Can explain product surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Gathering requirements

    Brainstorming

    Can explain brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.


    Exercises:

    Characteristic of brainstorming



    User surveys

    Can explain user surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.


    Observation

    Can explain observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.


    Interviews

    Can explain interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.


    Focus groups

    Can explain focus groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra


    Prototyping

    Can explain prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.


    Product surveys

    Can explain product surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/index.page-vue-render.js b/book/gatheringRequirements/index.page-vue-render.js index 6732a0b167..29dff45a7c 100644 --- a/book/gatheringRequirements/index.page-vue-render.js +++ b/book/gatheringRequirements/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"gathering-requirements"}},[_c('span',[_v("Gathering requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#gathering-requirements","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/interviews/index.html b/book/gatheringRequirements/interviews/index.html index f28a817cd1..d867558d28 100644 --- a/book/gatheringRequirements/interviews/index.html +++ b/book/gatheringRequirements/interviews/index.html @@ -13,7 +13,7 @@ +

    Interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/interviews/index.page-vue-render.js b/book/gatheringRequirements/interviews/index.page-vue-render.js index 3764fdaa94..951d610d2d 100644 --- a/book/gatheringRequirements/interviews/index.page-vue-render.js +++ b/book/gatheringRequirements/interviews/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"interviews"}},[_c('span',[_v("Interviews")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#interviews","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/observation/index.html b/book/gatheringRequirements/observation/index.html index 8edc542ce0..64da045a1d 100644 --- a/book/gatheringRequirements/observation/index.html +++ b/book/gatheringRequirements/observation/index.html @@ -13,7 +13,7 @@ +

    Observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/observation/index.page-vue-render.js b/book/gatheringRequirements/observation/index.page-vue-render.js index 584984a585..fed1f3777f 100644 --- a/book/gatheringRequirements/observation/index.page-vue-render.js +++ b/book/gatheringRequirements/observation/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain observation")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Requirements → Gathering Requirements →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"observation"}},[_c('span',[_v("Observation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#observation","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Observing users in their natural work environment can uncover product requirements.")]),_v(" Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement "),_c('span',{staticClass:"dimmed"},[_v("e.g. to find the situations where the user makes mistakes when using the current system")]),_v(".")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/productSurveys/index.html b/book/gatheringRequirements/productSurveys/index.html index ed8c5a1067..753d8b79ee 100644 --- a/book/gatheringRequirements/productSurveys/index.html +++ b/book/gatheringRequirements/productSurveys/index.html @@ -13,7 +13,7 @@

    Can explain product surveys

    Requirements → Gathering Requirements → -

    Product surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Product surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/productSurveys/index.page-vue-render.js b/book/gatheringRequirements/productSurveys/index.page-vue-render.js index 707297b132..561157beaa 100644 --- a/book/gatheringRequirements/productSurveys/index.page-vue-render.js +++ b/book/gatheringRequirements/productSurveys/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"product-surveys"}},[_c('span', with(this){return _c('p',[_c('strong',[_v("Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product.")]),_v(" Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/prototyping/index.html b/book/gatheringRequirements/prototyping/index.html index bb551f7032..ccc91e00e8 100644 --- a/book/gatheringRequirements/prototyping/index.html +++ b/book/gatheringRequirements/prototyping/index.html @@ -13,7 +13,7 @@

    Can explain prototyping

    Requirements → Gathering Requirements → -

    Prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/prototyping/index.page-vue-render.js b/book/gatheringRequirements/prototyping/index.page-vue-render.js index 58cda4cb5f..a4026f6f5e 100644 --- a/book/gatheringRequirements/prototyping/index.page-vue-render.js +++ b/book/gatheringRequirements/prototyping/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Prototyping can uncover requirements, with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Prototyping can be used for "),_c('em',[_v("discovering")]),_v(" as well as "),_c('em',[_v("specifying")]),_v(" requirements "),_c('span',{staticClass:"dimmed"},[_v("e.g. a UI prototype can serve as a specification of what to build")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gatheringRequirements/userSurveys/index.html b/book/gatheringRequirements/userSurveys/index.html index f116e9dde1..1cf8eb9bfe 100644 --- a/book/gatheringRequirements/userSurveys/index.html +++ b/book/gatheringRequirements/userSurveys/index.html @@ -13,7 +13,7 @@ +

    User surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gatheringRequirements/userSurveys/index.page-vue-render.js b/book/gatheringRequirements/userSurveys/index.page-vue-render.js index e424f9689d..ad4e8d1ef6 100644 --- a/book/gatheringRequirements/userSurveys/index.page-vue-render.js +++ b/book/gatheringRequirements/userSurveys/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain user surveys")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Requirements → Gathering Requirements →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"user-surveys"}},[_c('span',[_v("User surveys")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#user-surveys","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Surveys can be used to "),_c('em',[_v("solicit responses and opinions")]),_v(" from a large number of stakeholders")]),_v(" regarding a current product or a new product.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/branch/index.html b/book/gitAndGithub/branch/index.html index 4718e4c4c3..44531e768c 100644 --- a/book/gitAndGithub/branch/index.html +++ b/book/gitAndGithub/branch/index.html @@ -379,7 +379,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/branch/index.page-vue-render.js b/book/gitAndGithub/branch/index.page-vue-render.js index 75f5bbdf24..911172ea89 100644 --- a/book/gitAndGithub/branch/index.page-vue-render.js +++ b/book/gitAndGithub/branch/index.page-vue-render.js @@ -86,6 +86,6 @@ with(this){return _c('p',[_v("That is because "),_c('strong',[_v("Git does a "), with(this){return _c('p',[_c('strong',[_v("It is possible to force Git to create a merge commit even if fast forwarding is possible.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/checkout/index.html b/book/gitAndGithub/checkout/index.html index d7f61b9236..bac44f77c4 100644 --- a/book/gitAndGithub/checkout/index.html +++ b/book/gitAndGithub/checkout/index.html @@ -13,7 +13,7 @@

    Can load a specific version of a Git repo

    Tools → Git and GitHub → -

    checkout: Retrieving a specific revision

    Git can load a specific version of the history to the working directory. Note that if you have uncommitted changes in the working directory, you need to stash them first to prevent them from being overwritten.

    Double-click the commit you want to load to the working directory, or right-click on that commit and choose Checkout....

    Click OK to the warning about ‘detached HEAD’ (similar to below).

    The specified version is now loaded to the working folder, as indicated by the HEAD label. HEAD is a reference to the currently checked out commit.

    If you checkout a commit that comes before the commit in which you added the .gitignore file, Git will now show ignored files as ‘unstaged modifications’ because at Git hasn’t been told to ignore those files.

    To go back to the latest commit, double-click it.


    Use the checkout <commit-identifier> command to change the working directory to the state it was in at a specific past commit.

    • git checkout v1.0: loads the state as at commit tagged v1.0
    • git checkout 0023cdd: loads the state as at commit with the hash 0023cdd
    • git checkout HEAD~2: loads the state that is 2 commits behind the most recent commit

    For now, you can ignore the warning about ‘detached HEAD’.

    If you checkout a commit that comes before the commit in which you added the .gitignore file, Git will now show ignored files as ‘unstaged modifications’ because at Git hasn’t been told to ignore those files.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    checkout: Retrieving a specific revision

    Git can load a specific version of the history to the working directory. Note that if you have uncommitted changes in the working directory, you need to stash them first to prevent them from being overwritten.

    Double-click the commit you want to load to the working directory, or right-click on that commit and choose Checkout....

    Click OK to the warning about ‘detached HEAD’ (similar to below).

    The specified version is now loaded to the working folder, as indicated by the HEAD label. HEAD is a reference to the currently checked out commit.

    If you checkout a commit that comes before the commit in which you added the .gitignore file, Git will now show ignored files as ‘unstaged modifications’ because at Git hasn’t been told to ignore those files.

    To go back to the latest commit, double-click it.


    Use the checkout <commit-identifier> command to change the working directory to the state it was in at a specific past commit.

    • git checkout v1.0: loads the state as at commit tagged v1.0
    • git checkout 0023cdd: loads the state as at commit with the hash 0023cdd
    • git checkout HEAD~2: loads the state that is 2 commits behind the most recent commit

    For now, you can ignore the warning about ‘detached HEAD’.

    If you checkout a commit that comes before the commit in which you added the .gitignore file, Git will now show ignored files as ‘unstaged modifications’ because at Git hasn’t been told to ignore those files.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/checkout/index.page-vue-render.js b/book/gitAndGithub/checkout/index.page-vue-render.js index 1f6aece971..6c3ca64912 100644 --- a/book/gitAndGithub/checkout/index.page-vue-render.js +++ b/book/gitAndGithub/checkout/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"checkout-retrieving-a-specific-revision"}},[_c('span',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("checkout")]),_v(": Retrieving a specific revision")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#checkout-retrieving-a-specific-revision","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/clone/index.html b/book/gitAndGithub/clone/index.html index 698d3e7627..e1b3dfea58 100644 --- a/book/gitAndGithub/clone/index.html +++ b/book/gitAndGithub/clone/index.html @@ -15,7 +15,7 @@

    Can clone a remote repo

    Tools → Git and GitHub →

    clone: Copying a repo

    Given below is an example scenario you can try yourself to learn Git cloning.

    Suppose you want to clone the sample repo samplerepo-things to your computer.

    Note that the URL of the GitHub project is different from the URL you need to clone a repo in that GitHub project. e.g.

    GitHub project URL: https://github.com/se-edu/samplerepo-things
    -Git repo URL: https://github.com/se-edu/samplerepo-things.git (note the .git at the end)

    FileClone / New… and provide the URL of the repo and the destination directory.


    You can use the clone command to clone a repo.

    Follow the instructions given here.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Git repo URL: https://github.com/se-edu/samplerepo-things.git (note the .git at the end)

    FileClone / New… and provide the URL of the repo and the destination directory.


    You can use the clone command to clone a repo.

    Follow the instructions given here.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/clone/index.page-vue-render.js b/book/gitAndGithub/clone/index.page-vue-render.js index c15d3112b8..1b6bcd7e2b 100644 --- a/book/gitAndGithub/clone/index.page-vue-render.js +++ b/book/gitAndGithub/clone/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"clone-copying-a-repo"}},[_c('s with(this){return _c('p',[_v("Suppose you want to clone the sample repo "),_c('a',{attrs:{"href":"https://github.com/se-edu/samplerepo-things"}},[_v("samplerepo-things")]),_v(" to your computer.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/commit/index.html b/book/gitAndGithub/commit/index.html index af8bed6f2a..7d40981188 100644 --- a/book/gitAndGithub/commit/index.html +++ b/book/gitAndGithub/commit/index.html @@ -394,7 +394,7 @@ -

    To undo/delete last n commits: HEAD~1 is used to tell Git you are targeting the commit one position before the latest commit -- in this case the target commit is the one we want to reset to, not the one we want to undo (as the command used is reset). To undo/delete two last commits, you can use HEAD~2, and so on.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    To undo/delete last n commits: HEAD~1 is used to tell Git you are targeting the commit one position before the latest commit -- in this case the target commit is the one we want to reset to, not the one we want to undo (as the command used is reset). To undo/delete two last commits, you can use HEAD~2, and so on.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/commit/index.page-vue-render.js b/book/gitAndGithub/commit/index.page-vue-render.js index 00a594a067..4a15144111 100644 --- a/book/gitAndGithub/commit/index.page-vue-render.js +++ b/book/gitAndGithub/commit/index.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('p',[_v("Next, add two more files "),_c('code',{pre:true,at with(this){return _c('p',[_c('strong',[_v("6. See the revision graph:")]),_v(" Note how commits form a path-like structure aka the "),_c('em',[_v("revision tree/graph")]),_v(". In the revision graph, each commit is shown as linked to its 'parent' commit (i.e., the commit before it).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/createPRs/index.html b/book/gitAndGithub/createPRs/index.html index 33b455b664..79dfb3836f 100644 --- a/book/gitAndGithub/createPRs/index.html +++ b/book/gitAndGithub/createPRs/index.html @@ -128,7 +128,7 @@
  • The merge you are attempting will run into a merge conflict, due to the aforementioned conflicting code in the master branch. -Resolve the conflict manually (this topic is covered elsewhere), and complete the merge.
  • Push the PR branch to your fork. As the updated code in that branch no longer is conflicting with the master branch, the merge conflict alert in the PR will go away automatically.
  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Resolve the conflict manually (this topic is covered elsewhere), and complete the merge.
  • Push the PR branch to your fork. As the updated code in that branch no longer is conflicting with the master branch, the merge conflict alert in the PR will go away automatically.
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/createPRs/index.page-vue-render.js b/book/gitAndGithub/createPRs/index.page-vue-render.js index 882d8fd394..0a1c78349f 100644 --- a/book/gitAndGithub/createPRs/index.page-vue-render.js +++ b/book/gitAndGithub/createPRs/index.page-vue-render.js @@ -80,6 +80,6 @@ with(this){return _c('li',[_v("Push the PR branch to your fork. As the updated c with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://help.github.com/articles/creating-a-pull-request/"}},[_v("GitHub's own documentation on creating a PR")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/diff/index.html b/book/gitAndGithub/diff/index.html index 968d2c5136..2243c7e8ac 100644 --- a/book/gitAndGithub/diff/index.html +++ b/book/gitAndGithub/diff/index.html @@ -135,7 +135,7 @@ -

    Git can also show you the difference between two points in the history of the repo.

    Select the two points you want to compare using Ctrl+Click. The differences between the two selected versions will show up in the bottom half of Sourcetree, as shown in the screenshot below.

    The same method can be used to compare the current state of the working directory (which might have uncommitted changes) to a point in the history.


    The diff command can be used to view the differences between two points of the history.

    • git diff: shows the changes (uncommitted) since the last commit.
    • git diff 0023cdd..fcd6199: shows the changes between the points indicated by commit hashes.
      Note that when using a commit hash in a Git command, you can use only the first few characters (e.g., first 7-10 chars) as that's usually enough for Git to locate the commit.
    • git diff v1.0..HEAD: shows changes that happened from the commit tagged as v1.0 to the most recent commit.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Git can also show you the difference between two points in the history of the repo.

    Select the two points you want to compare using Ctrl+Click. The differences between the two selected versions will show up in the bottom half of Sourcetree, as shown in the screenshot below.

    The same method can be used to compare the current state of the working directory (which might have uncommitted changes) to a point in the history.


    The diff command can be used to view the differences between two points of the history.

    • git diff: shows the changes (uncommitted) since the last commit.
    • git diff 0023cdd..fcd6199: shows the changes between the points indicated by commit hashes.
      Note that when using a commit hash in a Git command, you can use only the first few characters (e.g., first 7-10 chars) as that's usually enough for Git to locate the commit.
    • git diff v1.0..HEAD: shows changes that happened from the commit tagged as v1.0 to the most recent commit.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/diff/index.page-vue-render.js b/book/gitAndGithub/diff/index.page-vue-render.js index 55cf70f78f..b3aedcbf95 100644 --- a/book/gitAndGithub/diff/index.page-vue-render.js +++ b/book/gitAndGithub/diff/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Git can show you what changed in each with(this){return _c('p',[_c('strong',[_v("Git can also show you the difference between two points in the history")]),_v(" of the repo.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/fork/index.html b/book/gitAndGithub/fork/index.html index 3b18c2a3c9..0e27882d19 100644 --- a/book/gitAndGithub/fork/index.html +++ b/book/gitAndGithub/fork/index.html @@ -13,7 +13,7 @@

    Can fork a repo

    Tools → Git and GitHub → -

    Fork: Creating a remote copy

    Given below is a scenario you can try in order to learn how to fork a repo:.

    0. Create a GitHub account if you don't have one yet.

    1. Go to the GitHub repo you want to fork e.g., samplerepo-things

    2. Click on the button on the top-right corner. In the next step,

    • choose to fork to your own account or to another GitHub organization that you are an admin of.
    • Un-tick the [ ] Copy the master branch only option, so that you get copies of other branches (if any) in the repo.

    As you might have guessed from the above, forking is not a Git feature, but a feature provided by remote Git hosting services such as Github.

    GitHub does not allow you to fork the same repo more than once to the same destination. If you want to re-fork, you need to delete the previous fork.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Fork: Creating a remote copy

    Given below is a scenario you can try in order to learn how to fork a repo:.

    0. Create a GitHub account if you don't have one yet.

    1. Go to the GitHub repo you want to fork e.g., samplerepo-things

    2. Click on the button on the top-right corner. In the next step,

    • choose to fork to your own account or to another GitHub organization that you are an admin of.
    • Un-tick the [ ] Copy the master branch only option, so that you get copies of other branches (if any) in the repo.

    As you might have guessed from the above, forking is not a Git feature, but a feature provided by remote Git hosting services such as Github.

    GitHub does not allow you to fork the same repo more than once to the same destination. If you want to re-fork, you need to delete the previous fork.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/fork/index.page-vue-render.js b/book/gitAndGithub/fork/index.page-vue-render.js index c9524b2e83..78f18bf125 100644 --- a/book/gitAndGithub/fork/index.page-vue-render.js +++ b/book/gitAndGithub/fork/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("1. Go to the GitHub repo you want to with(this){return _c('ul',[_c('li',[_v("choose to fork to your own account or to another GitHub organization that you are an admin of.")]),_v(" "),_c('li',[_c('mark',[_v("Un-tick the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[ ] Copy the master branch only")]),_v(" option")]),_v(", so that you get copies of other branches (if any) in the repo.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/forkingWorkflow/index.html b/book/gitAndGithub/forkingWorkflow/index.html index 0c6ec5bfc1..60f826a4c6 100644 --- a/book/gitAndGithub/forkingWorkflow/index.html +++ b/book/gitAndGithub/forkingWorkflow/index.html @@ -17,7 +17,7 @@ (1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo.
    If there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new master branch to each of them.
    (2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.
  • Some alternatives mechanisms to achieve the same can be found in this GitHub help page.
    -If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.
  • Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.

    Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/forkingWorkflow/index.page-vue-render.js b/book/gitAndGithub/forkingWorkflow/index.page-vue-render.js index 696b259201..4c8630a3fd 100644 --- a/book/gitAndGithub/forkingWorkflow/index.page-vue-render.js +++ b/book/gitAndGithub/forkingWorkflow/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can follow Forking Workflow")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Tools → Git and GitHub →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"forking-workflow"}},[_c('span',[_v("Forking workflow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#forking-workflow","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("You can follow the steps in the simulation of a forking workflow given below to learn how to follow such a workflow.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" This activity is best done as a team.")]),_v(" "),_c('p',[_c('strong',[_v("Step 1. One member: set up the team org and the team repo.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['1.1)', '1.2)', '1.3)', '1.4)', '1.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.1)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/articles/creating-a-new-organization-from-scratch/"}},[_c('strong',[_v("Create a GitHub organization")])]),_v(" for your team, if you don't have one already. The org name is up to you. We'll refer to this organization as "),_c('em',[_v("team org")]),_v(" from now on.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.2)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/enterprise/2.10/admin/guides/user-management/creating-teams/"}},[_c('strong',[_v("Add a team")])]),_v(" called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" to your team org.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.3)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/enterprise/2.0/admin/guides/user-management/adding-or-inviting-people-to-teams/"}},[_c('strong',[_v("Add team members")])]),_v(" to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" team.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.4)")]),_c('div',[_c('p',[_c('strong',[_v("Fork")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/se-edu/samplerepo-workflow-practice"}},[_v("se-edu/samplerepo-workflow-practice")]),_v(" to your team org. We'll refer to this as the "),_c('em',[_v("team repo")]),_v(".")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.5)")]),_c('div',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://help.github.com/articles/managing-team-access-to-an-organization-repository/"}},[_v("Add the forked repo")]),_v(" to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" team.")]),_v(" Give write access.")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 2. Each team member: create PRs via own fork.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['2.1)', '2.2)', '2.3)', '2.4)', '2.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.1)")]),_c('div',[_c('p',[_c('strong',[_v("Fork that repo")]),_v(" from your team org to your own GitHub account.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.2)")]),_c('div',[_c('p',[_c('strong',[_v("Create a branch")]),_v(" named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-{your name}-info")]),_v(" (e.g. "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-johnTan-info")]),_v(") in the local repo.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.3)")]),_c('div',[_c('p',[_c('strong',[_v("Add a file")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yourName.md")]),_v(" into the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("members")]),_v(" directory (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("members/johnTan.md")]),_v(") containing some info about you into that branch.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.4)")]),_c('div',[_c('p',[_c('strong',[_v("Push that branch to your fork")]),_v(".")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.5)")]),_c('div',[_c('p',[_c('strong',[_v("Create a PR")]),_v(" from that branch to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch of the team repo.")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 3. For each PR: review, update, and merge.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['3.1)', '3.2)', '3.3)', '3.4)', '3.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.1)")]),_c('div',[_c('p',[_c('strong',[_v("[A team member (not the PR author)] Review the PR")]),_v(" by adding comments (can be just dummy comments).")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.2)")]),_c('div',[_c('p',[_c('strong',[_v("[PR author] Update the PR")]),_v(" by pushing more commits to it, to simulate updating the PR based on review comments.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.3)")]),_c('div',[_c('p',[_c('strong',[_v("[Another team member] Approve and merge")]),_v(" the PR using the GitHub interface.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.4)")]),_c('div',[_c('p',[_c('strong',[_v("[All members]")]),_v(" "),_c('a',{attrs:{"href":"https://help.github.com/articles/syncing-a-fork/"}},[_c('strong',[_v("Sync your local repo (and your fork)")]),_v(" with upstream repo")]),_v(". In this case, your "),_c('em',[_v("upstream repo")]),_v(" is the repo in your team org.")]),_v(" "),_c('ul',[_c('li',[_v("The basic mechanism for this has two steps (which you can do using Git CLI or any Git GUI):"),_c('br'),_v("\n(1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo."),_c('br'),_v("\nIf there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to each of them."),_c('br'),_v("\n(2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.")]),_v(" "),_c('li',[_v("Some alternatives mechanisms to achieve the same can be found in "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork"}},[_v("this GitHub help page")]),_v("."),_c('br'),_v("\nIf you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 4. Create conflicting PRs.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['4.1)', '4.2)', '4.3)', '4.4)', '4.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("4.1)")]),_c('div',[_c('p',[_c('strong',[_v("[One member]: Update README:")]),_v(" In the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, remove John Doe and Jane Doe from the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(", commit, and push to the main repo.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("4.2)")]),_c('div',[_c('p',[_c('strong',[_v("[Each team member] Create a PR")]),_v(" to add yourself under the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Team Members")]),_v(" section in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(". Use a new branch for the PR e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-johnTan-name")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 5. Merge conflicting PRs")]),_v(" one at a time. Before merging a PR, you’ll have to resolve conflicts.")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['5.1)', '5.2)', '5.3)', '5.4)', '5.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.1)")]),_c('div',[_c('p',[_v("[Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.2)")]),_c('div',[_c('p',[_c('strong',[_v("[PR author] Resolve the conflict locally")]),_v(":")]),_v(" "),_c('ol',[_c('li',[_v("Pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch from the repo in your team org.")]),_v(" "),_c('li',[_v("Merge the pulled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your PR branch.")]),_v(" "),_c('li',[_v("Resolve the merge conflict that crops up during the merge.")]),_v(" "),_c('li',[_v("Push the updated PR branch to your fork.")])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.3)")]),_c('div',[_c('p',[_c('strong',[_v("[Another member or the PR author]: Merge the de-conflicted PR")]),_v(": When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.")])])])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/ignore/index.html b/book/gitAndGithub/ignore/index.html index d22c456e9b..3e9fadc940 100644 --- a/book/gitAndGithub/ignore/index.html +++ b/book/gitAndGithub/ignore/index.html @@ -85,7 +85,7 @@ -

    The .gitignore file

    The .gitignore file tells Git which files to ignore when tracking revision history. That file itself can be either revision controlled or ignored.

    • To version control it (the more common choice – which allows you to track how the .gitignore file changes over time), simply commit it as you would commit any other file.

    • To ignore it, follow the same steps you followed above when you set Git to ignore the temp.txt file.

    • It supports file patterns e.g., adding temp/*.tmp to the .gitignore file prevents Git from tracking any .tmp files in the temp directory.

    More information about the .gitignore file: git-scm.com/docs/gitignore

    Files recommended to be omitted from version control

    • Binary files generated when building your project e.g., *.class, *.jar, *.exe (reasons: 1. no need to version control these files as they can be generated again from the source code 2. Revision control systems are optimized for tracking text-based files, not binary files.
    • Temporary files e.g., log files generated while testing the product
    • Local files i.e., files specific to your own computer e.g., local settings of your IDE
    • Sensitive content i.e., files containing sensitive/personal information e.g., credential files, personal identification data (especially, if there is a possibility of those files getting leaked via the revision control system).
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The .gitignore file

    The .gitignore file tells Git which files to ignore when tracking revision history. That file itself can be either revision controlled or ignored.

    • To version control it (the more common choice – which allows you to track how the .gitignore file changes over time), simply commit it as you would commit any other file.

    • To ignore it, follow the same steps you followed above when you set Git to ignore the temp.txt file.

    • It supports file patterns e.g., adding temp/*.tmp to the .gitignore file prevents Git from tracking any .tmp files in the temp directory.

    More information about the .gitignore file: git-scm.com/docs/gitignore

    Files recommended to be omitted from version control

    • Binary files generated when building your project e.g., *.class, *.jar, *.exe (reasons: 1. no need to version control these files as they can be generated again from the source code 2. Revision control systems are optimized for tracking text-based files, not binary files.
    • Temporary files e.g., log files generated while testing the product
    • Local files i.e., files specific to your own computer e.g., local settings of your IDE
    • Sensitive content i.e., files containing sensitive/personal information e.g., credential files, personal identification data (especially, if there is a possibility of those files getting leaked via the revision control system).
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/ignore/index.page-vue-render.js b/book/gitAndGithub/ignore/index.page-vue-render.js index 6216478357..7930eb4958 100644 --- a/book/gitAndGithub/ignore/index.page-vue-render.js +++ b/book/gitAndGithub/ignore/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("Files recommended to be omitted from with(this){return _c('ul',[_c('li',[_c('strong',[_v("Binary files")]),_v(" "),_c('em',[_v("generated")]),_v(" when building your project "),_c('span',{staticClass:"dimmed"},[_v("e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.class")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.jar")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.exe")])]),_v(" (reasons: 1. no need to version control these files as they can be generated again from the source code 2. Revision control systems are optimized for tracking text-based files, not binary files.")]),_v(" "),_c('li',[_c('strong',[_v("Temporary files")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., log files generated while testing the product")])]),_v(" "),_c('li',[_c('strong',[_v("Local files")]),_v(" i.e., files specific to your own computer "),_c('span',{staticClass:"dimmed"},[_v("e.g., local settings of your IDE")])]),_v(" "),_c('li',[_c('strong',[_v("Sensitive content")]),_v(" i.e., files containing sensitive/personal information "),_c('span',{staticClass:"dimmed"},[_v("e.g., credential files, personal identification data")]),_v(" (especially, if there is a possibility of those files getting leaked via the revision control system).")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/index.html b/book/gitAndGithub/index.html index f9837899eb..342efe5e45 100644 --- a/book/gitAndGithub/index.html +++ b/book/gitAndGithub/index.html @@ -2030,7 +2030,7 @@ (1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo.
    If there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new master branch to each of them.
    (2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.
  • Some alternatives mechanisms to achieve the same can be found in this GitHub help page.
    -If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.
  • Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.

    Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/index.page-vue-render.js b/book/gitAndGithub/index.page-vue-render.js index 3596c47aae..0e9c473dca 100644 --- a/book/gitAndGithub/index.page-vue-render.js +++ b/book/gitAndGithub/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"git-and-github"}},[_c('span',[_v("Git and GitHub")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#git-and-github","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/init/index.html b/book/gitAndGithub/init/index.html index 7096fc13d5..4418c4faa2 100644 --- a/book/gitAndGithub/init/index.html +++ b/book/gitAndGithub/init/index.html @@ -202,7 +202,7 @@ -

    As you see above, this textbook explains how to use Git via Sourcetree (a GUI client) as well as via the Git CLI. If you are new to Git, we recommend you learn both the GUI method and the CLI method -- The GUI method will help you visualize the result better while the CLI method is more universal (i.e., you will not be tied to any GUI) and more flexible/powerful.

    It is fine to learn the CLI way only (using Sourcetree is optional), especially if you normally prefer to work with CLI over GUI.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    As you see above, this textbook explains how to use Git via Sourcetree (a GUI client) as well as via the Git CLI. If you are new to Git, we recommend you learn both the GUI method and the CLI method -- The GUI method will help you visualize the result better while the CLI method is more universal (i.e., you will not be tied to any GUI) and more flexible/powerful.

    It is fine to learn the CLI way only (using Sourcetree is optional), especially if you normally prefer to work with CLI over GUI.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/init/index.page-vue-render.js b/book/gitAndGithub/init/index.page-vue-render.js index 67d28db110..5468fb8f8d 100644 --- a/book/gitAndGithub/init/index.page-vue-render.js +++ b/book/gitAndGithub/init/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("2. Next, create a directory for the r with(this){return _c('p',[_c('strong',[_v("3. Then, initialize a repository")]),_v(" in that directory.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/managePRs/index.html b/book/gitAndGithub/managePRs/index.html index f07bbc992d..d122f66e11 100644 --- a/book/gitAndGithub/managePRs/index.html +++ b/book/gitAndGithub/managePRs/index.html @@ -16,7 +16,7 @@

    Merging PRs

    Let's look at the steps involved in merging a PR, assuming the PR has been reviewed, refined, and approved for merging already.

    Preparation: If you would like to try merging a PR yourself, you can create a dummy PR in the following manner.

    1. Fork any repo (e.g., samplerepo-pr-practice).
    2. Clone in to your computer.
    3. Create a new branch e.g., (feature1) and add some commits to it.
    4. Push the new branch to the fork.
    5. Create a PR from that branch to the master branch in your fork. Yes, it is possible to create a PR within the same repo.

    1. Locate the PR to be merged in your repo's GitHub page.

    2. Click on the Conversation tab and scroll to the bottom. You'll see a panel containing the PR status summary.

    3. If the PR is not merge-able in the current state, the Merge pull request will not be green. Here are the possible reasons and remedies:

    • Problem: The PR code is out-of-date, indicated by the message This branch is out-of-date with the base branch. That means the repo's master branch has been updated since the PR code was last updated.
      • If the PR author has allowed you to update the PR and you have sufficient permissions, GitHub will allow you to update the PR simply by clicking the Update branch on the right side of the 'out-of-date' error message. If that option is not available, post a message in the PR requesting the PR author to update the PR.
    • Problem: There are merge conflicts, indicated by the message This branch has conflicts that must be resolved. That means the repo's master branch has been updated since the PR code was last updated, in a way that the PR code conflicts with the current master branch. Those conflicts must be resolved before the PR can be merged. -
      • If the conflicts are simple, GitHub might allow you to resolve them using the Web interface.
      • If that option is not available, post a message in the PR requesting the PR author to update the PR.

    3. Merge the PR by clicking on the Merge pull request button, followed by the Confirm merge button. You should see a Pull request successfully merged and closed message after the PR is merged.

    • You can choose between three merging options by clicking on the down-arrow in the Merge pull request button. If you are new to Git and GitHub, the Create merge commit option is recommended.

    Next, sync your local repos (and forks). Merging a PR simply merges the code in the upstream remote repository in which it was merged. The PR author (and other members of the repo) needs to pull the merged code from the upstream repo to their local repos and push the new code to their respective forks to sync the fork with the upstream repo.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • If the conflicts are simple, GitHub might allow you to resolve them using the Web interface.
    • If that option is not available, post a message in the PR requesting the PR author to update the PR.

    3. Merge the PR by clicking on the Merge pull request button, followed by the Confirm merge button. You should see a Pull request successfully merged and closed message after the PR is merged.

    • You can choose between three merging options by clicking on the down-arrow in the Merge pull request button. If you are new to Git and GitHub, the Create merge commit option is recommended.

    Next, sync your local repos (and forks). Merging a PR simply merges the code in the upstream remote repository in which it was merged. The PR author (and other members of the repo) needs to pull the merged code from the upstream repo to their local repos and push the new code to their respective forks to sync the fork with the upstream repo.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/managePRs/index.page-vue-render.js b/book/gitAndGithub/managePRs/index.page-vue-render.js index 2eec895c1a..14d0b0b659 100644 --- a/book/gitAndGithub/managePRs/index.page-vue-render.js +++ b/book/gitAndGithub/managePRs/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('ul',[_c('li',[_v("If the conflicts are simple, GitHub migh with(this){return _c('p',[_c('strong',[_v("Next, sync your local repos (and forks).")]),_v(" Merging a PR simply merges the code in the upstream remote repository in which it was merged. The PR author (and other members of the repo) needs to pull the merged code from the upstream repo to their local repos and push the new code to their respective forks to sync the fork with the upstream repo.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/mergeConflicts/index.html b/book/gitAndGithub/mergeConflicts/index.html index dfe802e821..07c9f5fefb 100644 --- a/book/gitAndGithub/mergeConflicts/index.html +++ b/book/gitAndGithub/mergeConflicts/index.html @@ -184,7 +184,7 @@ -

    6. Stage the changes, and commit. You have now successfully resolved the merge conflict.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    6. Stage the changes, and commit. You have now successfully resolved the merge conflict.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/mergeConflicts/index.page-vue-render.js b/book/gitAndGithub/mergeConflicts/index.page-vue-render.js index b9f5bb182b..d5fd51923a 100644 --- a/book/gitAndGithub/mergeConflicts/index.page-vue-render.js +++ b/book/gitAndGithub/mergeConflicts/index.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs txt"}},[ with(this){return _c('p',[_c('strong',[_v("6. Stage the changes, and commit.")]),_v(" You have now successfully resolved the merge conflict.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/pull/index.html b/book/gitAndGithub/pull/index.html index f13760b768..7ba26c97d9 100644 --- a/book/gitAndGithub/pull/index.html +++ b/book/gitAndGithub/pull/index.html @@ -89,7 +89,7 @@ Click the Fetch button or the Pull button first.

    If the Remote branch to pull dropdown is empty, click the Refresh button on its right.

  • If the pull from the samplerepo-things-2 was successful, you should have received one more commit into your local repo.


    1. Navigate to the folder containing the local repo.

    2. Set the new remote repo as a remote of the local repo.
      command: git remote add {remote_name} {remote_repo_url}
      e.g., git remote add upstream1 https://github.com/johndoe/foobar.git

    3. Now you can fetch or pull (pulling will fetch the branch and merge the new code to the current branch) from the new remote.
      -e.g., git fetch upstream1 master followed by git merge upstream1/master, or,
      git pull upstream1 master


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +e.g., git fetch upstream1 master followed by git merge upstream1/master, or,
    git pull upstream1 master


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/pull/index.page-vue-render.js b/book/gitAndGithub/pull/index.page-vue-render.js index cbe5268ff9..20fd36bc4e 100644 --- a/book/gitAndGithub/pull/index.page-vue-render.js +++ b/book/gitAndGithub/pull/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("3. Pull")]),_v(" from the remote repo with(this){return _c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("You can also do a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("fetch")]),_v(" instead of a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pull")])]),_v(" in which case the new commits will be downloaded to your repo but the working directory will remain at the current commit. To move the current state to the latest commit that was downloaded, you need to do a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("merge")]),_v(". A "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pull")]),_v(" is a shortcut that does both those steps in one go.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/push/index.html b/book/gitAndGithub/push/index.html index 9411f39d9d..a21ad3cc4c 100644 --- a/book/gitAndGithub/push/index.html +++ b/book/gitAndGithub/push/index.html @@ -88,7 +88,7 @@

    You can push to repos other than the one you cloned from, as long as the target repo and your repo have a shared history.

    1. Add the GitHub repo URL as a remote, if you haven't done so already.
    2. Push to the target repo.

    Push your repo to the new remote the usual way, but select the name of target remote instead of origin and remember to select the Track checkbox.


    Push to the new remote the usual way e.g., git push upstream1 master (assuming you gave the name upstream1 to the remote).


    You can even push an entire local repository to GitHub, to form an entirely new remote repository. For example, you created a local repo and worked with it for a while but now you want to upload it onto GitHub (as a backup or to share it with others). The steps are given below.

    1. Create an empty remote repo on GitHub.

    1. Login to your GitHub account and choose to create a new Repo.

    2. In the next screen, provide a name for your repo but keep the Initialize this repo ... tick box unchecked.

    3. Note the URL of the repo. It will be of the form https://github.com/{your_user_name}/{repo_name}.git.
      e.g., https://github.com/johndoe/foobar.git (note the .git at the end)

    2. Add the GitHub repo URL as a remote of the local repo. You can give it the name origin (or any other name).

    3. Push the repo to the remote.


    Push each branch to the new remote the usual way but use the -u flag to inform Git that you wish to the branch.
    -e.g., git push -u origin master


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +e.g., git push -u origin master


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/push/index.page-vue-render.js b/book/gitAndGithub/push/index.page-vue-render.js index 2894dc2362..91dae64ebb 100644 --- a/book/gitAndGithub/push/index.page-vue-render.js +++ b/book/gitAndGithub/push/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("4. Push")]),_v(" the new commits to y with(this){return _c('p',[_c('strong',[_v("6. Push the new commits "),_c('mark',[_c('em',[_v("and")]),_v(" the tags")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/remoteBranches/index.html b/book/gitAndGithub/remoteBranches/index.html index 08ace77727..5affa44edd 100644 --- a/book/gitAndGithub/remoteBranches/index.html +++ b/book/gitAndGithub/remoteBranches/index.html @@ -341,7 +341,7 @@ -

    If you pull but your local branch has new commits the remote branch doesn't have, Git will automatically perform a merge between the local branch and the remote branch.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    If you pull but your local branch has new commits the remote branch doesn't have, Git will automatically perform a merge between the local branch and the remote branch.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/remoteBranches/index.page-vue-render.js b/book/gitAndGithub/remoteBranches/index.page-vue-render.js index ef81cec8ad..1a46ade407 100644 --- a/book/gitAndGithub/remoteBranches/index.page-vue-render.js +++ b/book/gitAndGithub/remoteBranches/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_c('strong',[_v("[C1] To push new changes in the local with(this){return _c('p',[_c('strong',[_v("[C2] To pull new changes from a remote branch to the corresponding local branch:")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/reviewPRs/index.html b/book/gitAndGithub/reviewPRs/index.html index e30e53281f..9a05c95ca8 100644 --- a/book/gitAndGithub/reviewPRs/index.html +++ b/book/gitAndGithub/reviewPRs/index.html @@ -55,7 +55,7 @@ - LGTM is often used in such overall comments, to indicate Looks good to me (or Looks good to merge).
    nit (as in nit-picking) is another such term, used to indicate minor flaws e.g., LGTM. Just a few nits to fix..
  • Choose Approve, Comment, or Request changes option as appropriate and click on the Submit review button.
  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    + LGTM is often used in such overall comments, to indicate Looks good to me (or Looks good to merge).
    nit (as in nit-picking) is another such term, used to indicate minor flaws e.g., LGTM. Just a few nits to fix..
  • Choose Approve, Comment, or Request changes option as appropriate and click on the Submit review button.
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/reviewPRs/index.page-vue-render.js b/book/gitAndGithub/reviewPRs/index.page-vue-render.js index 35db560d22..42b8f2f8ce 100644 --- a/book/gitAndGithub/reviewPRs/index.page-vue-render.js +++ b/book/gitAndGithub/reviewPRs/index.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('li',[_v("Choose "),_c('code',{pre:true,attrs:{"class":"lin with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://help.github.com/en/articles/about-pull-request-reviews"}},[_v("GitHub help on how to review PRs")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/guidelines/PRs-reviewing.html"}},[_c('em',[_v("Best practices for reviewing PRs")]),_v(" @SE-EDU/guides")]),_v(".")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/stash/index.html b/book/gitAndGithub/stash/index.html index 46e11adbf6..00d46f57b4 100644 --- a/book/gitAndGithub/stash/index.html +++ b/book/gitAndGithub/stash/index.html @@ -13,7 +13,7 @@ +

    stash: Shelving changes temporarily

    You can use Git's stash feature to temporarily shelve (or stash) changes you've made to your working copy so that you can work on something else, and then come back and re-apply the stashed changes later on. -- adapted from Atlassian

    Follow this article from Sourcetree creators. Note that the GUI shown in the article is slightly outdated but you should be able to map it to the current GUI.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/stash/index.page-vue-render.js b/book/gitAndGithub/stash/index.page-vue-render.js index 464dd70b68..18a88725f4 100644 --- a/book/gitAndGithub/stash/index.page-vue-render.js +++ b/book/gitAndGithub/stash/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"stash-shelving-changes-tempora with(this){return _c('p',[_c('strong',[_v("You can use Git's "),_c('mark',[_c('em',[_v("stash")])]),_v(" feature to temporarily shelve (or stash) changes you've made to your working copy")]),_v(" so that you can work on something else, and then come back and re-apply the stashed changes later on. "),_c('sub',[_v("-- adapted from "),_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/git-stash"}},[_v("Atlassian")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/gitAndGithub/tag/index.html b/book/gitAndGithub/tag/index.html index f5faefbdd5..d69a4c9ae9 100644 --- a/book/gitAndGithub/tag/index.html +++ b/book/gitAndGithub/tag/index.html @@ -85,7 +85,7 @@ -

    To learn how to add a tag to a past commit, go to the ‘Git Basics – Tagging’ page of the git-scm book and refer the ‘Tagging Later’ section.


    After adding a tag to a commit, you can use the tag to refer to that commit, as an alternative to using the hash.

    Annotated vs Lightweight Tags: The Git tags explained above are known as lightweight tags. There is another type of Git tags called annotated tags. See git-scm.com/book for more info.

    Tags are different from commit messages, in purpose and in form. A commit message is a description of the commit that is part of the commit itself. A tags is a short name for a commit, which exists as a separate entity that points to a commit.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    To learn how to add a tag to a past commit, go to the ‘Git Basics – Tagging’ page of the git-scm book and refer the ‘Tagging Later’ section.


    After adding a tag to a commit, you can use the tag to refer to that commit, as an alternative to using the hash.

    Annotated vs Lightweight Tags: The Git tags explained above are known as lightweight tags. There is another type of Git tags called annotated tags. See git-scm.com/book for more info.

    Tags are different from commit messages, in purpose and in form. A commit message is a description of the commit that is part of the commit itself. A tags is a short name for a commit, which exists as a separate entity that points to a commit.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/gitAndGithub/tag/index.page-vue-render.js b/book/gitAndGithub/tag/index.page-vue-render.js index 076406e6fe..9cead76678 100644 --- a/book/gitAndGithub/tag/index.page-vue-render.js +++ b/book/gitAndGithub/tag/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"tag-naming-commits"}},[_c('spa with(this){return _c('p',[_c('strong',[_v("Each Git commit is uniquely identified by a hash")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("d670460b4b4aece5915caf5c68d12f560a9fe3e4")]),_v(". As you can imagine, using such an identifier is not very convenient for our day-to-day use. As a solution, Git allows adding a more human-readable "),_c('em',[_v("tag")]),_v(" to a commit e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.0-beta")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/ides/debugging/index.html b/book/ides/debugging/index.html index 807ccdb255..2a5357b09d 100644 --- a/book/ides/debugging/index.html +++ b/book/ides/debugging/index.html @@ -15,7 +15,7 @@

    Implementation → IDEs →

    Debugging

    What

    Can explain debugging

    Debugging is the process of discovering defects in the program. Here are some approaches to debugging:

    • Bad -- By inserting temporary print statements: This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. Exiting process() method, x is 5.347. This approach is not recommended due to these reasons:
      • Incurs extra effort when inserting and removing the print statements.
      • These extraneous program modifications increase the risk of introducing errors into the program.
      • These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.
    • Bad -- By manually tracing through the code: Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons: -
      • It is a difficult, time consuming, and error-prone technique.
      • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
    • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • It is a difficult, time consuming, and error-prone technique.
    • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
  • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.

  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/ides/debugging/index.page-vue-render.js b/book/ides/debugging/index.page-vue-render.js index 4a05bea2c7..87585cb7da 100644 --- a/book/ides/debugging/index.page-vue-render.js +++ b/book/ides/debugging/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"debugging"}},[_c('span',[_v("Debugging")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#debugging","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/ides/debugging/what/index.html b/book/ides/debugging/what/index.html index e8216afc07..0f55398ff8 100644 --- a/book/ides/debugging/what/index.html +++ b/book/ides/debugging/what/index.html @@ -15,7 +15,7 @@

    Can explain debugging

    Implementation → IDEs → Debugging →

    What

    Debugging is the process of discovering defects in the program. Here are some approaches to debugging:

    • Bad -- By inserting temporary print statements: This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. Exiting process() method, x is 5.347. This approach is not recommended due to these reasons:
      • Incurs extra effort when inserting and removing the print statements.
      • These extraneous program modifications increase the risk of introducing errors into the program.
      • These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.
    • Bad -- By manually tracing through the code: Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons: -
      • It is a difficult, time consuming, and error-prone technique.
      • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
    • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • It is a difficult, time consuming, and error-prone technique.
    • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
  • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/ides/debugging/what/index.page-vue-render.js b/book/ides/debugging/what/index.page-vue-render.js index fd96ed91e8..6a5f835b16 100644 --- a/book/ides/debugging/what/index.page-vue-render.js +++ b/book/ides/debugging/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain debugging")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → IDEs → Debugging →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Debugging")]),_v(" is the process of discovering defects in the program.")]),_v(" Here are some approaches to debugging:")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('strong',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" -- "),_c('strong',[_v("By inserting temporary print statements")]),_v(": This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Exiting process() method, x is 5.347")]),_v(". This approach is not recommended due to these reasons:\n"),_c('ul',[_c('li',[_v("Incurs extra effort when inserting and removing the print statements.")]),_v(" "),_c('li',[_v("These extraneous program modifications increase the risk of introducing errors into the program.")]),_v(" "),_c('li',[_v("These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.")])])]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('strong',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" -- "),_c('strong',[_v("By manually tracing through the code")]),_v(": Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons:\n"),_c('ul',[_c('li',[_v("It is a difficult, time consuming, and error-prone technique.")]),_v(" "),_c('li',[_v("If you didn't spot the error while writing the code, you might not spot the error when reading the code either.")])])]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('strong',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" -- "),_c('strong',[_v("Using a debugger")]),_v(": A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. "),_c('strong',[_v("This is the recommended approach for debugging")]),_v(".")])])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/ides/index.html b/book/ides/index.html index 5e2183433a..c473f311ea 100644 --- a/book/ides/index.html +++ b/book/ides/index.html @@ -14,7 +14,7 @@

    IDEs

    Introduction

    What

    Can explain IDEs

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.


    Exercises:

    Which of these are features available in IDEs?




    Debugging

    What

    Can explain debugging

    Debugging is the process of discovering defects in the program. Here are some approaches to debugging:

    • Bad -- By inserting temporary print statements: This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. Exiting process() method, x is 5.347. This approach is not recommended due to these reasons:
      • Incurs extra effort when inserting and removing the print statements.
      • These extraneous program modifications increase the risk of introducing errors into the program.
      • These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.
    • Bad -- By manually tracing through the code: Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons: -
      • It is a difficult, time consuming, and error-prone technique.
      • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
    • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • It is a difficult, time consuming, and error-prone technique.
    • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
  • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.


  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/ides/index.page-vue-render.js b/book/ides/index.page-vue-render.js index 9a38c0454d..58265b2a41 100644 --- a/book/ides/index.page-vue-render.js +++ b/book/ides/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"ides"}},[_c('span',[_v("IDEs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ides","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/ides/introduction/index.html b/book/ides/introduction/index.html index ea8346dc42..0283d27161 100644 --- a/book/ides/introduction/index.html +++ b/book/ides/introduction/index.html @@ -13,7 +13,7 @@

    Implementation → IDEs → -

    Introduction

    What

    Can explain IDEs

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.


    Exercises:

    Which of these are features available in IDEs?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain IDEs

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.


    Exercises:

    Which of these are features available in IDEs?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/ides/introduction/index.page-vue-render.js b/book/ides/introduction/index.page-vue-render.js index 257eb297bb..994bd53f72 100644 --- a/book/ides/introduction/index.page-vue-render.js +++ b/book/ides/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/ides/introduction/what/index.html b/book/ides/introduction/what/index.html index 2c8a744936..ca824e1ec2 100644 --- a/book/ides/introduction/what/index.html +++ b/book/ides/introduction/what/index.html @@ -13,7 +13,7 @@

    Can explain IDEs

    Implementation → IDEs → -

    What

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.


    Exercises:

    Which of these are features available in IDEs?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.


    Exercises:

    Which of these are features available in IDEs?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/ides/introduction/what/index.page-vue-render.js b/book/ides/introduction/what/index.page-vue-render.js index 55832eff5b..ad4bc43156 100644 --- a/book/ides/introduction/what/index.page-vue-render.js +++ b/book/ides/introduction/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_v("Professional software engin with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/index.html b/book/index.html index 6e10181a12..bd708e750d 100644 --- a/book/index.html +++ b/book/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/index.page-vue-render.js b/book/index.page-vue-render.js index 6c94a16408..2a5b4dc1a2 100644 --- a/book/index.page-vue-render.js +++ b/book/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content",attrs:{"id":"all"}},[_c('div',{staticClass:"lead"},[_c('p',[_c('strong',[_v("This is a free and open-source SE textbook under the "),_c('a',{attrs:{"href":"https://se-education.org"}},[_v("SE-EDU")]),_v(" initiative.")])])]),_v(" "),_c('h3',{attrs:{"id":"about-this-book"}},[_v("About this book"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#about-this-book","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"/website/book/about/acknowledgements.html"}},[_v("About")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"/website/book/about/usage.html"}},[_v("How to use this book")])])]),_v(" "),_c('h3',{attrs:{"id":"software-engineering"}},[_v("Software engineering"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-engineering","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"/website/book/softwareEngineering/"}},[_v("Software engineering")]),_v(" "),_c('a',{attrs:{"href":"/website/book/softwareEngineering/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('h3',{attrs:{"id":"object-oriented-programming"}},[_v("Object-oriented programming"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#object-oriented-programming","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"/website/book/oop/"}},[_v("Object-oriented programming")]),_v(" "),_c('a',{attrs:{"href":"/website/book/oop/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('h3',{attrs:{"id":"requirements"}},[_v("Requirements"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#requirements","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/requirements/"}},[_v("Requirements")]),_v(" "),_c('a',{attrs:{"href":"/website/book/requirements/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/gatheringRequirements/"}},[_v("Gathering requirements")]),_v(" "),_c('a',{attrs:{"href":"/website/book/gatheringRequirements/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/specifyingRequirements/"}},[_v("Specifying requirements")]),_v(" "),_c('a',{attrs:{"href":"/website/book/specifyingRequirements/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('h3',{attrs:{"id":"design"}},[_v("Design"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/design/"}},[_v("Design")]),_v(" "),_c('a',{attrs:{"href":"/website/book/design/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/designFundamentals/"}},[_v("Design fundamentals")]),_v(" "),_c('a',{attrs:{"href":"/website/book/designFundamentals/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/modeling/"}},[_v("Modeling")]),_v(" "),_c('a',{attrs:{"href":"/website/book/modeling/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/architecture/"}},[_v("Architecture")]),_v(" "),_c('a',{attrs:{"href":"/website/book/architecture/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/designPatterns/"}},[_v("Design patterns")]),_v(" "),_c('a',{attrs:{"href":"/website/book/designPatterns/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/designApproaches/"}},[_v("Design approaches")]),_v(" "),_c('a',{attrs:{"href":"/website/book/designApproaches/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('h3',{attrs:{"id":"implementation"}},[_v("Implementation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#implementation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/ides/"}},[_v("IDEs")]),_v(" "),_c('a',{attrs:{"href":"/website/book/ides/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/codeQuality/"}},[_v("Code quality")]),_v(" "),_c('a',{attrs:{"href":"/website/book/codeQuality/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/refactoring/"}},[_v("Refactoring")]),_v(" "),_c('a',{attrs:{"href":"/website/book/refactoring/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/documentation/"}},[_v("Documentation")]),_v(" "),_c('a',{attrs:{"href":"/website/book/documentation/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/errorHandling/"}},[_v("Error handling")]),_v(" "),_c('a',{attrs:{"href":"/website/book/errorHandling/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/integration/"}},[_v("Integration")]),_v(" "),_c('a',{attrs:{"href":"/website/book/integration/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/reuse/"}},[_v("Reuse")]),_v(" "),_c('a',{attrs:{"href":"/website/book/reuse/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('h3',{attrs:{"id":"quality-assurance"}},[_v("Quality assurance"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#quality-assurance","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/qualityAssurance/"}},[_v("Quality assurance")]),_v(" "),_c('a',{attrs:{"href":"/website/book/qualityAssurance/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/testing/"}},[_v("Testing")]),_v(" "),_c('a',{attrs:{"href":"/website/book/testing/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/testCaseDesign/"}},[_v("Test case design")]),_v(" "),_c('a',{attrs:{"href":"/website/book/testCaseDesign/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('h3',{attrs:{"id":"project-management"}},[_v("Project management"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-management","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/revisionControl/"}},[_v("Revision control")]),_v(" "),_c('a',{attrs:{"href":"/website/book/revisionControl/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/projectPlanning/"}},[_v("Project planning")]),_v(" "),_c('a',{attrs:{"href":"/website/book/projectPlanning/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/teamwork/"}},[_v("Teamwork")]),_v(" "),_c('a',{attrs:{"href":"/website/book/teamwork/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/processModels/"}},[_v("Process models")]),_v(" "),_c('a',{attrs:{"href":"/website/book/processModels/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('h3',{attrs:{"id":"tools"}},[_v("Tools"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tools","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/uml/"}},[_v("UML")]),_v(" "),_c('a',{attrs:{"href":"/website/book/uml/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/intellij/"}},[_v("IntelliJ IDEA")]),_v(" "),_c('a',{attrs:{"href":"/website/book/intellij/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/gitAndGithub/"}},[_v("Git and GitHub")]),_v(" "),_c('a',{attrs:{"href":"/website/book/gitAndGithub/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('h3',{attrs:{"id":"principles"}},[_v("Principles"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#principles","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"/website/book/principles/"}},[_v("Principles")]),_v(" "),_c('a',{attrs:{"href":"/website/book/principles/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('h3',{attrs:{"id":"supplementary"}},[_v("Supplementary"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#supplementary","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/cppToJava/"}},[_v("C++ to Java")]),_v(" "),_c('a',{attrs:{"href":"/website/book/cppToJava/print.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/combined/exercises.html"}},[_v("Combined exercises")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/common/definitions.html"}},[_v("List of definitions")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/common/references.html"}},[_v("List of references")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/common/outcomes.html"}},[_v("List of learning outcomes")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/book/common/print.html"}},[_v("Printable version "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/approaches/bigBangVsIncremental/index.html b/book/integration/approaches/bigBangVsIncremental/index.html index ee94bd31fe..9db56b4047 100644 --- a/book/integration/approaches/bigBangVsIncremental/index.html +++ b/book/integration/approaches/bigBangVsIncremental/index.html @@ -13,7 +13,7 @@

    Can explain how integration approaches vary based on amount merged at a time

    Implementation → Integration → Approaches → -

    Big-bang versus incremental integration

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Big-bang versus incremental integration

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/approaches/bigBangVsIncremental/index.page-vue-render.js b/book/integration/approaches/bigBangVsIncremental/index.page-vue-render.js index 9fd179e657..868e0505bd 100644 --- a/book/integration/approaches/bigBangVsIncremental/index.page-vue-render.js +++ b/book/integration/approaches/bigBangVsIncremental/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('div',{staticClass:"block-embed-service-powerpoint"},[_c('i with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/approaches/index.html b/book/integration/approaches/index.html index dbcd97c457..f232b538dc 100644 --- a/book/integration/approaches/index.html +++ b/book/integration/approaches/index.html @@ -13,7 +13,7 @@

    Implementation → Integration → -

    Approaches

    Late and one time versus early and frequent

    Can explain how integration approaches vary based on timing and frequency

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:


    Big-bang versus incremental integration

    Can explain how integration approaches vary based on amount merged at a time

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects



    Top-down versus bottom-up integration

    Can explain how integration approaches vary based on the order of integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Approaches

    Late and one time versus early and frequent

    Can explain how integration approaches vary based on timing and frequency

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:


    Big-bang versus incremental integration

    Can explain how integration approaches vary based on amount merged at a time

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects



    Top-down versus bottom-up integration

    Can explain how integration approaches vary based on the order of integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/approaches/index.page-vue-render.js b/book/integration/approaches/index.page-vue-render.js index 48d70ec04e..4858354b9b 100644 --- a/book/integration/approaches/index.page-vue-render.js +++ b/book/integration/approaches/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"approaches"}},[_c('span',[_v("Approaches")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#approaches","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/approaches/lateVsEarly/index.html b/book/integration/approaches/lateVsEarly/index.html index 783ad85c6e..551bd61485 100644 --- a/book/integration/approaches/lateVsEarly/index.html +++ b/book/integration/approaches/lateVsEarly/index.html @@ -13,7 +13,7 @@

    Can explain how integration approaches vary based on timing and frequency

    Implementation → Integration → Approaches → -

    Late and one time versus early and frequent

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Late and one time versus early and frequent

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/approaches/lateVsEarly/index.page-vue-render.js b/book/integration/approaches/lateVsEarly/index.page-vue-render.js index 20bec22096..2d40a54742 100644 --- a/book/integration/approaches/lateVsEarly/index.page-vue-render.js +++ b/book/integration/approaches/lateVsEarly/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Early and frequent")]),_v(": with(this){return _c('div',{staticClass:"block-embed-service-powerpoint"},[_c('iframe',{attrs:{"type":"text/html","src":"https://onedrive.live.com/embed?cid=A5AF047C4CAD67AB&resid=A5AF047C4CAD67AB%212312&authkey=AHtrsZMwQmNcyAE&em=2&action=embedview&wdAr=1.3333333333333333","frameborder":"0","width":"610","height":"481","webkitallowfullscreen":"","mozallowfullscreen":"","allowfullscreen":""}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/approaches/topDownVsBottomUp/index.html b/book/integration/approaches/topDownVsBottomUp/index.html index 4407aaed89..4008d76670 100644 --- a/book/integration/approaches/topDownVsBottomUp/index.html +++ b/book/integration/approaches/topDownVsBottomUp/index.html @@ -13,7 +13,7 @@

    Can explain how integration approaches vary based on the order of integration

    Implementation → Integration → Approaches → -

    Top-down versus bottom-up integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Top-down versus bottom-up integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/approaches/topDownVsBottomUp/index.page-vue-render.js b/book/integration/approaches/topDownVsBottomUp/index.page-vue-render.js index 6b63f58b19..efabdbfb1c 100644 --- a/book/integration/approaches/topDownVsBottomUp/index.page-vue-render.js +++ b/book/integration/approaches/topDownVsBottomUp/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('div',{staticClass:"block-embed-service-powerpoint"},[_c('i with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/buildAutomation/continuousIntegrationDeployment/index.html b/book/integration/buildAutomation/continuousIntegrationDeployment/index.html index 3ec46257d7..a2a0d90615 100644 --- a/book/integration/buildAutomation/continuousIntegrationDeployment/index.html +++ b/book/integration/buildAutomation/continuousIntegrationDeployment/index.html @@ -13,7 +13,7 @@

    Can explain continuous integration and continuous deployment

    Implementation → Integration → Build Automation → -

    Continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/buildAutomation/continuousIntegrationDeployment/index.page-vue-render.js b/book/integration/buildAutomation/continuousIntegrationDeployment/index.page-vue-render.js index 06ad45cc92..341c472412 100644 --- a/book/integration/buildAutomation/continuousIntegrationDeployment/index.page-vue-render.js +++ b/book/integration/buildAutomation/continuousIntegrationDeployment/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("An extreme application of build autom with(this){return _c('p',[_c('strong',[_v("A natural extension of CI is "),_c('em',[_v("Continuous Deployment (CD)")]),_v(" where the changes are not only integrated continuously, but also deployed to end-users at the same time.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/buildAutomation/index.html b/book/integration/buildAutomation/index.html index 48e08c88c6..f6cd637b6e 100644 --- a/book/integration/buildAutomation/index.html +++ b/book/integration/buildAutomation/index.html @@ -13,7 +13,7 @@

    Implementation → Integration → -

    Build Automation

    What

    Can explain build automation tools

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.


    Continuous integration and continuous deployment

    Can explain continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Build Automation

    What

    Can explain build automation tools

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.


    Continuous integration and continuous deployment

    Can explain continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/buildAutomation/index.page-vue-render.js b/book/integration/buildAutomation/index.page-vue-render.js index 0414f4514e..124b887d6f 100644 --- a/book/integration/buildAutomation/index.page-vue-render.js +++ b/book/integration/buildAutomation/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"build-automation"}},[_c('span',[_v("Build Automation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#build-automation","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/buildAutomation/what/index.html b/book/integration/buildAutomation/what/index.html index 21b97ac85d..94305bb3f7 100644 --- a/book/integration/buildAutomation/what/index.html +++ b/book/integration/buildAutomation/what/index.html @@ -13,7 +13,7 @@

    Can explain build automation tools

    Implementation → Integration → Build Automation → -

    What

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/buildAutomation/what/index.page-vue-render.js b/book/integration/buildAutomation/what/index.page-vue-render.js index 7c5058c170..10bd114418 100644 --- a/book/integration/buildAutomation/what/index.page-vue-render.js +++ b/book/integration/buildAutomation/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Some build tools also serve as "),_c( with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/gradle.html"}},[_c('strong',[_v("Gradle tutorial from se-edu/guides")])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/index.html b/book/integration/index.html index 9e1f967145..e70c74928d 100644 --- a/book/integration/index.html +++ b/book/integration/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Integration

    Introduction

    What

    Can explain integration

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.



    Approaches

    Late and one time versus early and frequent

    Can explain how integration approaches vary based on timing and frequency

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:


    Big-bang versus incremental integration

    Can explain how integration approaches vary based on amount merged at a time

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects



    Top-down versus bottom-up integration

    Can explain how integration approaches vary based on the order of integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order




    Build Automation

    What

    Can explain build automation tools

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.


    Continuous integration and continuous deployment

    Can explain continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions



    More

    Review

    Can combine some integration concepts


    Exercises:

    Which is the recommended integration approach in general?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Integration

    Introduction

    What

    Can explain integration

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.



    Approaches

    Late and one time versus early and frequent

    Can explain how integration approaches vary based on timing and frequency

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:


    Big-bang versus incremental integration

    Can explain how integration approaches vary based on amount merged at a time

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects



    Top-down versus bottom-up integration

    Can explain how integration approaches vary based on the order of integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order




    Build Automation

    What

    Can explain build automation tools

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.


    Continuous integration and continuous deployment

    Can explain continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions



    More

    Review

    Can combine some integration concepts


    Exercises:

    Which is the recommended integration approach in general?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/index.page-vue-render.js b/book/integration/index.page-vue-render.js index dc103a3da2..3c18f7f696 100644 --- a/book/integration/index.page-vue-render.js +++ b/book/integration/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"integration"}},[_c('span',[_v("Integration")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#integration","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/introduction/index.html b/book/integration/introduction/index.html index 330f455e2b..6cdfac2a60 100644 --- a/book/integration/introduction/index.html +++ b/book/integration/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    What

    Can explain integration

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/introduction/index.page-vue-render.js b/book/integration/introduction/index.page-vue-render.js index 278135ba2a..79df0688df 100644 --- a/book/integration/introduction/index.page-vue-render.js +++ b/book/integration/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/introduction/what/index.html b/book/integration/introduction/what/index.html index 44852a168a..d8016eb452 100644 --- a/book/integration/introduction/what/index.html +++ b/book/integration/introduction/what/index.html @@ -13,7 +13,7 @@ +

    What

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/introduction/what/index.page-vue-render.js b/book/integration/introduction/what/index.page-vue-render.js index 1e484234a3..741bfaf392 100644 --- a/book/integration/introduction/what/index.page-vue-render.js +++ b/book/integration/introduction/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain integration")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Integration → Introduction →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Combining parts of a software product to form a whole is called "),_c('em',[_v("integration")])]),_v(". It is also one of the most troublesome tasks and it rarely goes smoothly.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/more/index.html b/book/integration/more/index.html index ce9230ac6b..fd1954e33e 100644 --- a/book/integration/more/index.html +++ b/book/integration/more/index.html @@ -13,7 +13,7 @@ +

    More

    Review

    Can combine some integration concepts


    Exercises:

    Which is the recommended integration approach in general?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/more/index.page-vue-render.js b/book/integration/more/index.page-vue-render.js index 247377fb90..747f78ad15 100644 --- a/book/integration/more/index.page-vue-render.js +++ b/book/integration/more/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"more"}},[_c('span',[_v("More")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/integration/more/review/index.html b/book/integration/more/review/index.html index 01229ab150..b6a9de7df0 100644 --- a/book/integration/more/review/index.html +++ b/book/integration/more/review/index.html @@ -13,7 +13,7 @@ +

    Review


    Exercises:

    Which is the recommended integration approach in general?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/integration/more/review/index.page-vue-render.js b/book/integration/more/review/index.page-vue-render.js index db519db62c..bfb7be6ad6 100644 --- a/book/integration/more/review/index.page-vue-render.js +++ b/book/integration/more/review/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"review"}},[_c('span',[_v("Revi with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/intellij/codeNavigation/index.html b/book/intellij/codeNavigation/index.html index 63c0b7e7ac..533da0c767 100644 --- a/book/intellij/codeNavigation/index.html +++ b/book/intellij/codeNavigation/index.html @@ -13,7 +13,7 @@

    Can navigate code effectively using IDE features

    Tools → IntelliJ IDEA → -

    Code navigation

    Some useful navigation shortcuts:

    1. Quickly locate a file by name.
    2. Go to the definition of a method from where it is used.
    3. Go back to the previous location.
    4. View the documentation of a method from where the method is being used, without navigating to the method itself.
    5. Find where a method/field is being used.

    IntelliJ IDEA Code Navigation


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Code navigation

    Some useful navigation shortcuts:

    1. Quickly locate a file by name.
    2. Go to the definition of a method from where it is used.
    3. Go back to the previous location.
    4. View the documentation of a method from where the method is being used, without navigating to the method itself.
    5. Find where a method/field is being used.

    IntelliJ IDEA Code Navigation


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/intellij/codeNavigation/index.page-vue-render.js b/book/intellij/codeNavigation/index.page-vue-render.js index e1219aa6f0..b99a0fa777 100644 --- a/book/intellij/codeNavigation/index.page-vue-render.js +++ b/book/intellij/codeNavigation/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"code-navigation"}},[_c('span', with(this){return _c('ol',[_c('li',[_v("Quickly locate a file by name.")]),_v(" "),_c('li',[_v("Go to the definition of a method from where it is used.")]),_v(" "),_c('li',[_v("Go back to the previous location.")]),_v(" "),_c('li',[_v("View the documentation of a method from where the method is being used, without navigating to the method itself.")]),_v(" "),_c('li',[_v("Find where a method/field is being used.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/intellij/debuggingBasic/index.html b/book/intellij/debuggingBasic/index.html index aae03c583e..f673c08262 100644 --- a/book/intellij/debuggingBasic/index.html +++ b/book/intellij/debuggingBasic/index.html @@ -13,7 +13,7 @@ +

    Debugging: Basic

    This video (from LaunchCode) gives a pretty good explanation of how to use the IntelliJ IDEA debugger.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/intellij/debuggingBasic/index.page-vue-render.js b/book/intellij/debuggingBasic/index.page-vue-render.js index 6a22e6fafc..86c7c696a5 100644 --- a/book/intellij/debuggingBasic/index.page-vue-render.js +++ b/book/intellij/debuggingBasic/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',{staticClass:"block-embed block-embed-service-youtube with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/intellijDebugger.html"}},[_v("[guide@se-edu] Intellij IDEA: Using the debugger")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/intellij/index.html b/book/intellij/index.html index 027942011a..9f5643d4d4 100644 --- a/book/intellij/index.html +++ b/book/intellij/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    IntelliJ IDEA

    Project setup

    Can setup a project in an IDE

    Running IntelliJ IDEA for the First Time

    A slightly more detailed explanation (from CodeLaunch) with some additional info at the end.




    Code navigation

    Can navigate code effectively using IDE features

    Some useful navigation shortcuts:

    1. Quickly locate a file by name.
    2. Go to the definition of a method from where it is used.
    3. Go back to the previous location.
    4. View the documentation of a method from where the method is being used, without navigating to the method itself.
    5. Find where a method/field is being used.

    IntelliJ IDEA Code Navigation



    Productivity shortcuts

    Can use some useful IDE productivity shortcuts


    Debugging: Basic

    Can step through a program using a debugger

    This video (from LaunchCode) gives a pretty good explanation of how to use the IntelliJ IDEA debugger.


    Refactoring

    Can use automated refactoring features of the IDE

    This video explains how to automate the 'Extract variable' refactoring using IntelliJ IDEA. Most other refactorings available work similarly. i.e. select the code to refactorfind the refactoring in the context menu or use the keyboard shortcut.

    Here's another video explaining how to do some more useful refactorings in IntelliJ IDEA.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    IntelliJ IDEA

    Project setup

    Can setup a project in an IDE

    Running IntelliJ IDEA for the First Time

    A slightly more detailed explanation (from CodeLaunch) with some additional info at the end.




    Code navigation

    Can navigate code effectively using IDE features

    Some useful navigation shortcuts:

    1. Quickly locate a file by name.
    2. Go to the definition of a method from where it is used.
    3. Go back to the previous location.
    4. View the documentation of a method from where the method is being used, without navigating to the method itself.
    5. Find where a method/field is being used.

    IntelliJ IDEA Code Navigation



    Productivity shortcuts

    Can use some useful IDE productivity shortcuts


    Debugging: Basic

    Can step through a program using a debugger

    This video (from LaunchCode) gives a pretty good explanation of how to use the IntelliJ IDEA debugger.


    Refactoring

    Can use automated refactoring features of the IDE

    This video explains how to automate the 'Extract variable' refactoring using IntelliJ IDEA. Most other refactorings available work similarly. i.e. select the code to refactorfind the refactoring in the context menu or use the keyboard shortcut.

    Here's another video explaining how to do some more useful refactorings in IntelliJ IDEA.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/intellij/index.page-vue-render.js b/book/intellij/index.page-vue-render.js index e66d4dfe8e..92539283c9 100644 --- a/book/intellij/index.page-vue-render.js +++ b/book/intellij/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"intellij-idea"}},[_c('span',[_v("IntelliJ IDEA")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intellij-idea","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/intellij/productivityShortcuts/index.html b/book/intellij/productivityShortcuts/index.html index 74bf6c4c63..fe444f744d 100644 --- a/book/intellij/productivityShortcuts/index.html +++ b/book/intellij/productivityShortcuts/index.html @@ -13,7 +13,7 @@ +

    Productivity shortcuts

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/intellij/productivityShortcuts/index.page-vue-render.js b/book/intellij/productivityShortcuts/index.page-vue-render.js index b30f29d1c1..c5089f7771 100644 --- a/book/intellij/productivityShortcuts/index.page-vue-render.js +++ b/book/intellij/productivityShortcuts/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"productivity-shortcuts"}},[_c( with(this){return _c('div',{staticClass:"block-embed block-embed-service-youtube",staticStyle:{"position":"relative","padding-bottom":"60.9375%"}},[_c('iframe',{attrs:{"type":"text/html","src":"//www.youtube.com/embed/41CC-F6KRP8","frameborder":"0","webkitallowfullscreen":"","mozallowfullscreen":"","allowfullscreen":""}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/intellij/projectSetup/index.html b/book/intellij/projectSetup/index.html index e4b7211103..b491dfdaf5 100644 --- a/book/intellij/projectSetup/index.html +++ b/book/intellij/projectSetup/index.html @@ -13,7 +13,7 @@ +

    Project setup

    Running IntelliJ IDEA for the First Time

    A slightly more detailed explanation (from CodeLaunch) with some additional info at the end.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/intellij/projectSetup/index.page-vue-render.js b/book/intellij/projectSetup/index.page-vue-render.js index 0dba2944d4..8aa4f0cd06 100644 --- a/book/intellij/projectSetup/index.page-vue-render.js +++ b/book/intellij/projectSetup/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"project-setup"}},[_c('span',[_ with(this){return _c('h5',{attrs:{"id":"running-intellij-idea-for-the-first-time"}},[_v("Running IntelliJ IDEA for the First Time"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#running-intellij-idea-for-the-first-time","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/intellij/refactoring/index.html b/book/intellij/refactoring/index.html index 7abb931d9d..2d95c4eceb 100644 --- a/book/intellij/refactoring/index.html +++ b/book/intellij/refactoring/index.html @@ -13,7 +13,7 @@

    Can use automated refactoring features of the IDE

    Tools → IntelliJ IDEA → -

    Refactoring

    This video explains how to automate the 'Extract variable' refactoring using IntelliJ IDEA. Most other refactorings available work similarly. i.e. select the code to refactorfind the refactoring in the context menu or use the keyboard shortcut.

    Here's another video explaining how to do some more useful refactorings in IntelliJ IDEA.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Refactoring

    This video explains how to automate the 'Extract variable' refactoring using IntelliJ IDEA. Most other refactorings available work similarly. i.e. select the code to refactorfind the refactoring in the context menu or use the keyboard shortcut.

    Here's another video explaining how to do some more useful refactorings in IntelliJ IDEA.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/intellij/refactoring/index.page-vue-render.js b/book/intellij/refactoring/index.page-vue-render.js index 55d7d44c9b..dce845d7b5 100644 --- a/book/intellij/refactoring/index.page-vue-render.js +++ b/book/intellij/refactoring/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('div',{staticClass:"block-embed block-embed-service-youtube with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.jetbrains.com/help/idea/introduction-to-refactoring.html"}},[_v("Introduction to Refactoring (in IntelliJ IDEA)")]),_v(": An article on the refactorings available in IntelliJ IDEA.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/index.html b/book/modeling/index.html index 1b24168594..403826e054 100644 --- a/book/modeling/index.html +++ b/book/modeling/index.html @@ -114,7 +114,7 @@

    UML: Sequence Diagrams: Reference Frames

    Loading...


    Use case diagrams

    Can explain use case diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:


    Timing diagrams

    Can explain timing diagrams

    A timing diagram focuses on timing constraints.

    Here is an example timing diagram:


    Adapted from: UML Distilled by Martin Fowler


    Interaction overview diagrams

    Can explain interaction overview diagrams

    Interaction overview diagrams are a combination of activity diagrams and sequence diagrams.

    An example:

    source: https://commons.wikimedia.org


    Communication diagrams

    Can explain communication diagrams

    Communication diagrams are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.

    An example:


    Adapted from: UML Distilled by Martin Fowler


    State machine diagrams

    Can explain state machine diagrams

    A State Machine Diagram models state-dependent behavior.

    Consider how a CD player responds when the “eject CD” button is pushed:

    • If the CD tray is already open, it does nothing.
    • If the CD tray is already in the process of opening (opened half-way), it continues to open the CD tray.
    • If the CD tray is closed and the CD is being played, it stops playing and opens the CD tray.
    • If the CD tray is closed and CD is not being played, it simply opens the CD tray.
    • If the CD tray is already in the process of closing (closed half-way), it waits until the CD tray is fully closed and opens it immediately afterwards.

    What this means is that the CD player’s response to pushing the “eject CD” button depends on what it was doing at the time of the event. More generally, the CD player’s response to the event received depends on its internal state. Such a behavior is called a state-dependent behavior.

    Often, state-dependent behavior displayed by an object in a system is simple enough that it needs no extra attention; such a behavior can be as simple as a conditional behavior like if x > y, then x = x - y.

    Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML state machine diagrams (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).

    An SMD views the life-cycle of an object as consisting of a finite number of states where each state displays a unique behavior pattern. SMDs capture information such as the states an object can be in during its lifetime, how the object responds to various events while in each state, and how the object transits from one state to another. In contrast to sequence diagrams that capture object behavior one scenario at a time, SMDs capture the object’s behavior over its full life-cycle.

    An SMD for the Minesweeper game.



    Modeling a solution

    Introduction

    Can explain how modeling can be used before implementation

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.


    Basic

    Can use simple class diagrams and sequence diagrams to model an OO solution

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:


    Intermediate

    Can use intermediate class diagram and sequence diagram concepts to model an OO design

    Continuing with the example in [Design → Modeling → Modeling a Solution → Basic], next let us model how the TextUi interacts with the Logic to support the mark and clear operations until the game is won or lost.

    This interaction adds the following methods to the Logic class:

    • clearCellAt(int x, int y)
    • markCellAt(int x, int y)
    • getGameState(): GAME_STATE (GAME_STATE: READY, IN_PLAY, WON, LOST, …)

    And it adds the following operation to Logic API:

    • getAppearanceOfCellAt(int,int): CELL_APPEARANCE (CELL_APPEARANCE: HIDDEN, ZERO, ONE, TWO, THREE, …, MARKED, INCORRECTLY_MARKED, INCORRECTLY_CLEARED)

    In the above design, TextUi does not access Cell objects directly. Instead, it gets values of type CELL_APPEARANCE from Logic to be displayed as a minefield to the player. Alternatively, each cell or the entire minefield can be passed directly to TextUi.

    Here is the updated class diagram:

    The above is for the case when Actor Player interacts with the system using a text UI. Additional operations (if any) required for the GUI can be discovered similarly. -Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/index.page-vue-render.js b/book/modeling/index.page-vue-render.js index 24bf2042dd..f4fe0bc0d6 100644 --- a/book/modeling/index.page-vue-render.js +++ b/book/modeling/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"modeling"}},[_c('span',[_v("Modeling")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#modeling","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/introduction/how/index.html b/book/modeling/introduction/how/index.html index 9f738a4cb9..bbdd840e30 100644 --- a/book/modeling/introduction/how/index.html +++ b/book/modeling/introduction/how/index.html @@ -13,7 +13,7 @@

    Can explain how models are used

    Design → Modelling → Introduction → -

    How

    In software development, models are useful in several ways:

    a) To analyze a complex entity related to software development.

    Some examples of using models for analysis:

    1. Models of the can be built to aid the understanding of the problem to be solved.
    2. When planning a software solution, models can be created to figure out how the solution is to be built. An architecture diagram is such a model.

    b) To communicate information among stakeholders. Models can be used as a visual aid in discussions and documentation.

    Some examples of using models to communicate:

    1. You can use an architecture diagram to explain the high-level design of the software to developers.
    2. A business analyst can use a use case diagram to explain to the customer the functionality of the system.
    3. A class diagram can be reverse-engineered from code so as to help explain the design of a component to a new developer.

    c) As a blueprint for creating software. Models can be used as instructions for building software.

    Some examples of using models as blueprints:

    1. A senior developer draws a class diagram to propose a design for an OOP software and passes it to a junior programmer to implement.
    2. A software tool allows users to draw UML models using its interface and the tool automatically generates the code based on the model.
    Model Driven Development extra


    Exercises:

    Statements about models


    Explain usage of models in a class project


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    In software development, models are useful in several ways:

    a) To analyze a complex entity related to software development.

    Some examples of using models for analysis:

    1. Models of the can be built to aid the understanding of the problem to be solved.
    2. When planning a software solution, models can be created to figure out how the solution is to be built. An architecture diagram is such a model.

    b) To communicate information among stakeholders. Models can be used as a visual aid in discussions and documentation.

    Some examples of using models to communicate:

    1. You can use an architecture diagram to explain the high-level design of the software to developers.
    2. A business analyst can use a use case diagram to explain to the customer the functionality of the system.
    3. A class diagram can be reverse-engineered from code so as to help explain the design of a component to a new developer.

    c) As a blueprint for creating software. Models can be used as instructions for building software.

    Some examples of using models as blueprints:

    1. A senior developer draws a class diagram to propose a design for an OOP software and passes it to a junior programmer to implement.
    2. A software tool allows users to draw UML models using its interface and the tool automatically generates the code based on the model.
    Model Driven Development extra


    Exercises:

    Statements about models


    Explain usage of models in a class project


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/introduction/how/index.page-vue-render.js b/book/modeling/introduction/how/index.page-vue-render.js index 29392b42a8..4453cc21ff 100644 --- a/book/modeling/introduction/how/index.page-vue-render.js +++ b/book/modeling/introduction/how/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("c) As a blueprint for creating softwa with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/introduction/index.html b/book/modeling/introduction/index.html index d28f3f365d..c25eabb943 100644 --- a/book/modeling/introduction/index.html +++ b/book/modeling/introduction/index.html @@ -13,7 +13,7 @@

    Design → Modeling → -

    Introduction

    What

    Can explain models

    A model is a representation of something else.

    A class diagram is a model that represents a software design.

    A model provides a simpler view of a complex entity because a model captures only a selected aspect. This omission of some aspects implies models are abstractions.

    A class diagram captures the structure of the software design but not the behavior.

    Multiple models of the same entity may be needed to capture it fully.

    In addition to a class diagram (or even multiple class diagrams), a number of other diagrams may be needed to capture various interesting aspects of the software.


    How

    Can explain how models are used

    In software development, models are useful in several ways:

    a) To analyze a complex entity related to software development.

    Some examples of using models for analysis:

    1. Models of the can be built to aid the understanding of the problem to be solved.
    2. When planning a software solution, models can be created to figure out how the solution is to be built. An architecture diagram is such a model.

    b) To communicate information among stakeholders. Models can be used as a visual aid in discussions and documentation.

    Some examples of using models to communicate:

    1. You can use an architecture diagram to explain the high-level design of the software to developers.
    2. A business analyst can use a use case diagram to explain to the customer the functionality of the system.
    3. A class diagram can be reverse-engineered from code so as to help explain the design of a component to a new developer.

    c) As a blueprint for creating software. Models can be used as instructions for building software.

    Some examples of using models as blueprints:

    1. A senior developer draws a class diagram to propose a design for an OOP software and passes it to a junior programmer to implement.
    2. A software tool allows users to draw UML models using its interface and the tool automatically generates the code based on the model.
    Model Driven Development extra


    Exercises:

    Statements about models


    Explain usage of models in a class project



    UML models

    Can identify UML models

    Unified Modeling Language (UML) is a graphical notation to describe various aspects of a software system. UML is the brainchild of three software modeling specialists James Rumbaugh, Grady Booch and Ivar Jacobson (also known as the Three Amigos). Each of them had developed their own notation for modeling software systems before joining forces to create a unified modeling language (hence, the term ‘Unified’ in UML). UML is currently the most commonly used modeling notation used in the software industry.

    The following diagram uses the class diagram notation to show the different types of UML diagrams.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain models

    A model is a representation of something else.

    A class diagram is a model that represents a software design.

    A model provides a simpler view of a complex entity because a model captures only a selected aspect. This omission of some aspects implies models are abstractions.

    A class diagram captures the structure of the software design but not the behavior.

    Multiple models of the same entity may be needed to capture it fully.

    In addition to a class diagram (or even multiple class diagrams), a number of other diagrams may be needed to capture various interesting aspects of the software.


    How

    Can explain how models are used

    In software development, models are useful in several ways:

    a) To analyze a complex entity related to software development.

    Some examples of using models for analysis:

    1. Models of the can be built to aid the understanding of the problem to be solved.
    2. When planning a software solution, models can be created to figure out how the solution is to be built. An architecture diagram is such a model.

    b) To communicate information among stakeholders. Models can be used as a visual aid in discussions and documentation.

    Some examples of using models to communicate:

    1. You can use an architecture diagram to explain the high-level design of the software to developers.
    2. A business analyst can use a use case diagram to explain to the customer the functionality of the system.
    3. A class diagram can be reverse-engineered from code so as to help explain the design of a component to a new developer.

    c) As a blueprint for creating software. Models can be used as instructions for building software.

    Some examples of using models as blueprints:

    1. A senior developer draws a class diagram to propose a design for an OOP software and passes it to a junior programmer to implement.
    2. A software tool allows users to draw UML models using its interface and the tool automatically generates the code based on the model.
    Model Driven Development extra


    Exercises:

    Statements about models


    Explain usage of models in a class project



    UML models

    Can identify UML models

    Unified Modeling Language (UML) is a graphical notation to describe various aspects of a software system. UML is the brainchild of three software modeling specialists James Rumbaugh, Grady Booch and Ivar Jacobson (also known as the Three Amigos). Each of them had developed their own notation for modeling software systems before joining forces to create a unified modeling language (hence, the term ‘Unified’ in UML). UML is currently the most commonly used modeling notation used in the software industry.

    The following diagram uses the class diagram notation to show the different types of UML diagrams.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/introduction/index.page-vue-render.js b/book/modeling/introduction/index.page-vue-render.js index eb0d9ee92f..67e5b805e3 100644 --- a/book/modeling/introduction/index.page-vue-render.js +++ b/book/modeling/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/introduction/umlModels/index.html b/book/modeling/introduction/umlModels/index.html index 58d4871915..7e61574c21 100644 --- a/book/modeling/introduction/umlModels/index.html +++ b/book/modeling/introduction/umlModels/index.html @@ -13,7 +13,7 @@

    Can identify UML models

    Design → Modelling → Introduction → -

    UML models

    Unified Modeling Language (UML) is a graphical notation to describe various aspects of a software system. UML is the brainchild of three software modeling specialists James Rumbaugh, Grady Booch and Ivar Jacobson (also known as the Three Amigos). Each of them had developed their own notation for modeling software systems before joining forces to create a unified modeling language (hence, the term ‘Unified’ in UML). UML is currently the most commonly used modeling notation used in the software industry.

    The following diagram uses the class diagram notation to show the different types of UML diagrams.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    UML models

    Unified Modeling Language (UML) is a graphical notation to describe various aspects of a software system. UML is the brainchild of three software modeling specialists James Rumbaugh, Grady Booch and Ivar Jacobson (also known as the Three Amigos). Each of them had developed their own notation for modeling software systems before joining forces to create a unified modeling language (hence, the term ‘Unified’ in UML). UML is currently the most commonly used modeling notation used in the software industry.

    The following diagram uses the class diagram notation to show the different types of UML diagrams.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/introduction/umlModels/index.page-vue-render.js b/book/modeling/introduction/umlModels/index.page-vue-render.js index efef47a162..6856ccc9c1 100644 --- a/book/modeling/introduction/umlModels/index.page-vue-render.js +++ b/book/modeling/introduction/umlModels/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"uml-models"}},[_c('span',[_v("UML models")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#uml-models","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/introduction/what/index.html b/book/modeling/introduction/what/index.html index 85550a3358..b1a9e3cac9 100644 --- a/book/modeling/introduction/what/index.html +++ b/book/modeling/introduction/what/index.html @@ -13,7 +13,7 @@

    Can explain models

    Design → Modelling → Introduction → -

    What

    A model is a representation of something else.

    A class diagram is a model that represents a software design.

    A model provides a simpler view of a complex entity because a model captures only a selected aspect. This omission of some aspects implies models are abstractions.

    A class diagram captures the structure of the software design but not the behavior.

    Multiple models of the same entity may be needed to capture it fully.

    In addition to a class diagram (or even multiple class diagrams), a number of other diagrams may be needed to capture various interesting aspects of the software.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    A model is a representation of something else.

    A class diagram is a model that represents a software design.

    A model provides a simpler view of a complex entity because a model captures only a selected aspect. This omission of some aspects implies models are abstractions.

    A class diagram captures the structure of the software design but not the behavior.

    Multiple models of the same entity may be needed to capture it fully.

    In addition to a class diagram (or even multiple class diagrams), a number of other diagrams may be needed to capture various interesting aspects of the software.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/introduction/what/index.page-vue-render.js b/book/modeling/introduction/what/index.page-vue-render.js index 7714cbbd86..abd5b3bf35 100644 --- a/book/modeling/introduction/what/index.page-vue-render.js +++ b/book/modeling/introduction/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('strong',[_v("A "),_c('em',[_v("model")]),_v(" provides a s with(this){return _c('p',[_c('strong',[_v("Multiple models of the same entity may be needed to capture it fully.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingASolution/basic/index.html b/book/modeling/modelingASolution/basic/index.html index 4d5098366c..39605ccfe8 100644 --- a/book/modeling/modelingASolution/basic/index.html +++ b/book/modeling/modelingASolution/basic/index.html @@ -13,7 +13,7 @@

    Can use simple class diagrams and sequence diagrams to model an OO solution

    Design → Modeling → Modeling a Solution → -

    Basic

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Basic

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingASolution/basic/index.page-vue-render.js b/book/modeling/modelingASolution/basic/index.page-vue-render.js index d49a2425ae..a7b123aa41 100644 --- a/book/modeling/modelingASolution/basic/index.page-vue-render.js +++ b/book/modeling/modelingASolution/basic/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_v("Note that the behavior of the "),_c('code',{pre:tr with(this){return _c('p',[_v("Given below are the interactions between the player and the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TextUi")]),_v(" for the whole game.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingASolution/index.html b/book/modeling/modelingASolution/index.html index 74e49cb85d..b2bad5f77e 100644 --- a/book/modeling/modelingASolution/index.html +++ b/book/modeling/modelingASolution/index.html @@ -14,7 +14,7 @@

    Design → Modeling →

    Modeling a solution

    Introduction

    Can explain how modeling can be used before implementation

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.


    Basic

    Can use simple class diagrams and sequence diagrams to model an OO solution

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:


    Intermediate

    Can use intermediate class diagram and sequence diagram concepts to model an OO design

    Continuing with the example in [Design → Modeling → Modeling a Solution → Basic], next let us model how the TextUi interacts with the Logic to support the mark and clear operations until the game is won or lost.

    This interaction adds the following methods to the Logic class:

    • clearCellAt(int x, int y)
    • markCellAt(int x, int y)
    • getGameState(): GAME_STATE (GAME_STATE: READY, IN_PLAY, WON, LOST, …)

    And it adds the following operation to Logic API:

    • getAppearanceOfCellAt(int,int): CELL_APPEARANCE (CELL_APPEARANCE: HIDDEN, ZERO, ONE, TWO, THREE, …, MARKED, INCORRECTLY_MARKED, INCORRECTLY_CLEARED)

    In the above design, TextUi does not access Cell objects directly. Instead, it gets values of type CELL_APPEARANCE from Logic to be displayed as a minefield to the player. Alternatively, each cell or the entire minefield can be passed directly to TextUi.

    Here is the updated class diagram:

    The above is for the case when Actor Player interacts with the system using a text UI. Additional operations (if any) required for the GUI can be discovered similarly. -Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingASolution/index.page-vue-render.js b/book/modeling/modelingASolution/index.page-vue-render.js index 7ebc107317..50d1277045 100644 --- a/book/modeling/modelingASolution/index.page-vue-render.js +++ b/book/modeling/modelingASolution/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"modeling-a-solution"}},[_c('span',[_v("Modeling a solution")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#modeling-a-solution","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingASolution/intermediate/index.html b/book/modeling/modelingASolution/intermediate/index.html index dc9c558a84..1e70091bb8 100644 --- a/book/modeling/modelingASolution/intermediate/index.html +++ b/book/modeling/modelingASolution/intermediate/index.html @@ -14,7 +14,7 @@

    Can use intermediate class diagram and sequence diagram concepts to model an OO design

    Design → Modeling → Modeling a Solution →

    Intermediate

    Continuing with the example in [Design → Modeling → Modeling a Solution → Basic], next let us model how the TextUi interacts with the Logic to support the mark and clear operations until the game is won or lost.

    This interaction adds the following methods to the Logic class:

    • clearCellAt(int x, int y)
    • markCellAt(int x, int y)
    • getGameState(): GAME_STATE (GAME_STATE: READY, IN_PLAY, WON, LOST, …)

    And it adds the following operation to Logic API:

    • getAppearanceOfCellAt(int,int): CELL_APPEARANCE (CELL_APPEARANCE: HIDDEN, ZERO, ONE, TWO, THREE, …, MARKED, INCORRECTLY_MARKED, INCORRECTLY_CLEARED)

    In the above design, TextUi does not access Cell objects directly. Instead, it gets values of type CELL_APPEARANCE from Logic to be displayed as a minefield to the player. Alternatively, each cell or the entire minefield can be passed directly to TextUi.

    Here is the updated class diagram:

    The above is for the case when Actor Player interacts with the system using a text UI. Additional operations (if any) required for the GUI can be discovered similarly. -Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingASolution/intermediate/index.page-vue-render.js b/book/modeling/modelingASolution/intermediate/index.page-vue-render.js index 75b0662f5d..9fd460841c 100644 --- a/book/modeling/modelingASolution/intermediate/index.page-vue-render.js +++ b/book/modeling/modelingASolution/intermediate/index.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('p',[_v("It is now time to explore what happens inside the with(this){return _c('p',[_v("Now let us assume that "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Minesweeper")]),_v(" supports a ‘timing’ feature.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingASolution/introduction/index.html b/book/modeling/modelingASolution/introduction/index.html index edc6c4dba9..6b69704658 100644 --- a/book/modeling/modelingASolution/introduction/index.html +++ b/book/modeling/modelingASolution/introduction/index.html @@ -13,7 +13,7 @@

    Can explain how modeling can be used before implementation

    Design → Modeling → Modeling a Solution → -

    Introduction

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingASolution/introduction/index.page-vue-render.js b/book/modeling/modelingASolution/introduction/index.page-vue-render.js index 0e1237fa61..441ad5bced 100644 --- a/book/modeling/modelingASolution/introduction/index.page-vue-render.js +++ b/book/modeling/modelingASolution/introduction/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("You can use models to analyze and des with(this){return _c('ul',[_c('li',[_v("Is this class structure able to produce the behavior you want?")]),_v(" "),_c('li',[_v("What API should each class have?")]),_v(" "),_c('li',[_v("Do you need more classes?")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/activityDiagrams/index.html b/book/modeling/modelingBehaviors/activityDiagrams/index.html index c4e3313729..5a378c29d7 100644 --- a/book/modeling/modelingBehaviors/activityDiagrams/index.html +++ b/book/modeling/modelingBehaviors/activityDiagrams/index.html @@ -22,7 +22,7 @@ Loading...

    UML Activity Diagrams → Basic Notation → Parallel Paths

    Loading... -


    Exercises:

    Which sequences are not allowed?


    Model the algorithms of calculating grades


    Model workflow of a Burger shop


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    Which sequences are not allowed?


    Model the algorithms of calculating grades


    Model workflow of a Burger shop


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/activityDiagrams/index.page-vue-render.js b/book/modeling/modelingBehaviors/activityDiagrams/index.page-vue-render.js index ef3975d124..723ab7e989 100644 --- a/book/modeling/modelingBehaviors/activityDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/activityDiagrams/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('small',[_c('span with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.html b/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.html index 752c799a09..3a7746e66a 100644 --- a/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.html +++ b/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.html @@ -17,7 +17,7 @@ Loading...

    UML Activity Diagrams → Intermediate Notation → Swim Lanes

    Loading... -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.page-vue-render.js b/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.page-vue-render.js index e12bd7c00b..b7618be65d 100644 --- a/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/activityDiagramsIntermediate/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"activity-diagrams-intermediate"}},[_c('span',[_v("Activity diagrams - intermediate")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#activity-diagrams-intermediate","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/communicationDiagrams/index.html b/book/modeling/modelingBehaviors/communicationDiagrams/index.html index 810c4583bc..4f9044f952 100644 --- a/book/modeling/modelingBehaviors/communicationDiagrams/index.html +++ b/book/modeling/modelingBehaviors/communicationDiagrams/index.html @@ -13,7 +13,7 @@ +

    Communication diagrams

    Communication diagrams are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.

    An example:


    Adapted from: UML Distilled by Martin Fowler

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/communicationDiagrams/index.page-vue-render.js b/book/modeling/modelingBehaviors/communicationDiagrams/index.page-vue-render.js index 12446efdfc..31c01b92d6 100644 --- a/book/modeling/modelingBehaviors/communicationDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/communicationDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"communication-diagrams"}},[_c( with(this){return _c('p',[_c('strong',[_c('em',[_v("Communication diagrams")]),_v(" are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/index.html b/book/modeling/modelingBehaviors/index.html index a682412b45..f7a360a943 100644 --- a/book/modeling/modelingBehaviors/index.html +++ b/book/modeling/modelingBehaviors/index.html @@ -50,7 +50,7 @@ Loading...

    UML: Sequence Diagrams: Reference Frames

    Loading... -


    Use case diagrams

    Can explain use case diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:


    Timing diagrams

    Can explain timing diagrams

    A timing diagram focuses on timing constraints.

    Here is an example timing diagram:


    Adapted from: UML Distilled by Martin Fowler


    Interaction overview diagrams

    Can explain interaction overview diagrams

    Interaction overview diagrams are a combination of activity diagrams and sequence diagrams.

    An example:

    source: https://commons.wikimedia.org


    Communication diagrams

    Can explain communication diagrams

    Communication diagrams are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.

    An example:


    Adapted from: UML Distilled by Martin Fowler


    State machine diagrams

    Can explain state machine diagrams

    A State Machine Diagram models state-dependent behavior.

    Consider how a CD player responds when the “eject CD” button is pushed:

    • If the CD tray is already open, it does nothing.
    • If the CD tray is already in the process of opening (opened half-way), it continues to open the CD tray.
    • If the CD tray is closed and the CD is being played, it stops playing and opens the CD tray.
    • If the CD tray is closed and CD is not being played, it simply opens the CD tray.
    • If the CD tray is already in the process of closing (closed half-way), it waits until the CD tray is fully closed and opens it immediately afterwards.

    What this means is that the CD player’s response to pushing the “eject CD” button depends on what it was doing at the time of the event. More generally, the CD player’s response to the event received depends on its internal state. Such a behavior is called a state-dependent behavior.

    Often, state-dependent behavior displayed by an object in a system is simple enough that it needs no extra attention; such a behavior can be as simple as a conditional behavior like if x > y, then x = x - y.

    Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML state machine diagrams (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).

    An SMD views the life-cycle of an object as consisting of a finite number of states where each state displays a unique behavior pattern. SMDs capture information such as the states an object can be in during its lifetime, how the object responds to various events while in each state, and how the object transits from one state to another. In contrast to sequence diagrams that capture object behavior one scenario at a time, SMDs capture the object’s behavior over its full life-cycle.

    An SMD for the Minesweeper game.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Use case diagrams

    Can explain use case diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:


    Timing diagrams

    Can explain timing diagrams

    A timing diagram focuses on timing constraints.

    Here is an example timing diagram:


    Adapted from: UML Distilled by Martin Fowler


    Interaction overview diagrams

    Can explain interaction overview diagrams

    Interaction overview diagrams are a combination of activity diagrams and sequence diagrams.

    An example:

    source: https://commons.wikimedia.org


    Communication diagrams

    Can explain communication diagrams

    Communication diagrams are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.

    An example:


    Adapted from: UML Distilled by Martin Fowler


    State machine diagrams

    Can explain state machine diagrams

    A State Machine Diagram models state-dependent behavior.

    Consider how a CD player responds when the “eject CD” button is pushed:

    • If the CD tray is already open, it does nothing.
    • If the CD tray is already in the process of opening (opened half-way), it continues to open the CD tray.
    • If the CD tray is closed and the CD is being played, it stops playing and opens the CD tray.
    • If the CD tray is closed and CD is not being played, it simply opens the CD tray.
    • If the CD tray is already in the process of closing (closed half-way), it waits until the CD tray is fully closed and opens it immediately afterwards.

    What this means is that the CD player’s response to pushing the “eject CD” button depends on what it was doing at the time of the event. More generally, the CD player’s response to the event received depends on its internal state. Such a behavior is called a state-dependent behavior.

    Often, state-dependent behavior displayed by an object in a system is simple enough that it needs no extra attention; such a behavior can be as simple as a conditional behavior like if x > y, then x = x - y.

    Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML state machine diagrams (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).

    An SMD views the life-cycle of an object as consisting of a finite number of states where each state displays a unique behavior pattern. SMDs capture information such as the states an object can be in during its lifetime, how the object responds to various events while in each state, and how the object transits from one state to another. In contrast to sequence diagrams that capture object behavior one scenario at a time, SMDs capture the object’s behavior over its full life-cycle.

    An SMD for the Minesweeper game.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/index.page-vue-render.js b/book/modeling/modelingBehaviors/index.page-vue-render.js index 1077f0eba2..b8f90865d3 100644 --- a/book/modeling/modelingBehaviors/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"modeling-behaviors"}},[_c('span',[_v("Modeling behaviors")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#modeling-behaviors","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.html b/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.html index b3ebb24c25..a4c78ae255 100644 --- a/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.html +++ b/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.html @@ -13,7 +13,7 @@ +

    Interaction overview diagrams

    Interaction overview diagrams are a combination of activity diagrams and sequence diagrams.

    An example:

    source: https://commons.wikimedia.org

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.page-vue-render.js b/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.page-vue-render.js index 9d26efd0cd..8c68ba668b 100644 --- a/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/interactionOverviewDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"interaction-overview-diagrams" with(this){return _c('p',[_c('strong',[_c('em',[_v("Interaction overview")]),_v(" diagrams are a combination of activity diagrams and sequence diagrams")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.html b/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.html index 171b24822b..94af259135 100644 --- a/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.html +++ b/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.html @@ -17,7 +17,7 @@ Loading...

    UML: Sequence Diagrams: Reference Frames

    Loading... -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.page-vue-render.js b/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.page-vue-render.js index be56408dd1..c8a1c2aa7c 100644 --- a/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/sequenceDiagramsAdvanced/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"sequence-diagrams-advanced"}},[_c('span',[_v("Sequence diagrams - advanced")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#sequence-diagrams-advanced","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.html b/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.html index 11c6de7ae7..90627048fa 100644 --- a/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.html +++ b/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.html @@ -23,7 +23,7 @@ Loading...

    UML Sequence Diagrams → Minimal Notation

    Loading... -


    Exercises:

    Explain Sequence Diagram about Machine


    Draw a Sequence Diagram for the code (PersonList, Person, Tag)


    Find notation errors in Sequence Diagram


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    Explain Sequence Diagram about Machine


    Draw a Sequence Diagram for the code (PersonList, Person, Tag)


    Find notation errors in Sequence Diagram


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.page-vue-render.js b/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.page-vue-render.js index b59cacda71..f7901219c4 100644 --- a/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/sequenceDiagramsBasic/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('small',[_c('span with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.html b/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.html index e0ca7f21f4..4af8141e84 100644 --- a/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.html +++ b/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.html @@ -23,7 +23,7 @@ Loading...

    UML Sequence Diagrams → Calls to Static Methods

    Loading... -


    Exercises:

    What’s going on here?


    Explain Sequence Diagram (ParserFactory)


    Draw Sequence Diagram for printing a quote


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    What’s going on here?


    Explain Sequence Diagram (ParserFactory)


    Draw Sequence Diagram for printing a quote


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.page-vue-render.js b/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.page-vue-render.js index ab33646e5c..09aa416ede 100644 --- a/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/sequenceDiagramsIntermediate/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"sequence-diagrams-intermediate with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/stateMachineDiagrams/index.html b/book/modeling/modelingBehaviors/stateMachineDiagrams/index.html index ea4f678a01..751983c4f8 100644 --- a/book/modeling/modelingBehaviors/stateMachineDiagrams/index.html +++ b/book/modeling/modelingBehaviors/stateMachineDiagrams/index.html @@ -13,7 +13,7 @@

    Can explain state machine diagrams

    Design → Modelling → Modelling Behaviors → -

    State machine diagrams

    A State Machine Diagram models state-dependent behavior.

    Consider how a CD player responds when the “eject CD” button is pushed:

    • If the CD tray is already open, it does nothing.
    • If the CD tray is already in the process of opening (opened half-way), it continues to open the CD tray.
    • If the CD tray is closed and the CD is being played, it stops playing and opens the CD tray.
    • If the CD tray is closed and CD is not being played, it simply opens the CD tray.
    • If the CD tray is already in the process of closing (closed half-way), it waits until the CD tray is fully closed and opens it immediately afterwards.

    What this means is that the CD player’s response to pushing the “eject CD” button depends on what it was doing at the time of the event. More generally, the CD player’s response to the event received depends on its internal state. Such a behavior is called a state-dependent behavior.

    Often, state-dependent behavior displayed by an object in a system is simple enough that it needs no extra attention; such a behavior can be as simple as a conditional behavior like if x > y, then x = x - y.

    Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML state machine diagrams (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).

    An SMD views the life-cycle of an object as consisting of a finite number of states where each state displays a unique behavior pattern. SMDs capture information such as the states an object can be in during its lifetime, how the object responds to various events while in each state, and how the object transits from one state to another. In contrast to sequence diagrams that capture object behavior one scenario at a time, SMDs capture the object’s behavior over its full life-cycle.

    An SMD for the Minesweeper game.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    State machine diagrams

    A State Machine Diagram models state-dependent behavior.

    Consider how a CD player responds when the “eject CD” button is pushed:

    • If the CD tray is already open, it does nothing.
    • If the CD tray is already in the process of opening (opened half-way), it continues to open the CD tray.
    • If the CD tray is closed and the CD is being played, it stops playing and opens the CD tray.
    • If the CD tray is closed and CD is not being played, it simply opens the CD tray.
    • If the CD tray is already in the process of closing (closed half-way), it waits until the CD tray is fully closed and opens it immediately afterwards.

    What this means is that the CD player’s response to pushing the “eject CD” button depends on what it was doing at the time of the event. More generally, the CD player’s response to the event received depends on its internal state. Such a behavior is called a state-dependent behavior.

    Often, state-dependent behavior displayed by an object in a system is simple enough that it needs no extra attention; such a behavior can be as simple as a conditional behavior like if x > y, then x = x - y.

    Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML state machine diagrams (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).

    An SMD views the life-cycle of an object as consisting of a finite number of states where each state displays a unique behavior pattern. SMDs capture information such as the states an object can be in during its lifetime, how the object responds to various events while in each state, and how the object transits from one state to another. In contrast to sequence diagrams that capture object behavior one scenario at a time, SMDs capture the object’s behavior over its full life-cycle.

    An SMD for the Minesweeper game.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/stateMachineDiagrams/index.page-vue-render.js b/book/modeling/modelingBehaviors/stateMachineDiagrams/index.page-vue-render.js index f318b2eb8c..1d8e69d478 100644 --- a/book/modeling/modelingBehaviors/stateMachineDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/stateMachineDiagrams/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_v("Often, state-dependent behavior displayed by an ob with(this){return _c('p',[_v("Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML "),_c('em',[_v("state machine diagrams")]),_v(" (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/timingDiagrams/index.html b/book/modeling/modelingBehaviors/timingDiagrams/index.html index 895365eb44..290e538ec4 100644 --- a/book/modeling/modelingBehaviors/timingDiagrams/index.html +++ b/book/modeling/modelingBehaviors/timingDiagrams/index.html @@ -13,7 +13,7 @@ +

    Timing diagrams

    A timing diagram focuses on timing constraints.

    Here is an example timing diagram:


    Adapted from: UML Distilled by Martin Fowler

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/timingDiagrams/index.page-vue-render.js b/book/modeling/modelingBehaviors/timingDiagrams/index.page-vue-render.js index 9de8a11396..9b87e7b458 100644 --- a/book/modeling/modelingBehaviors/timingDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/timingDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"timing-diagrams"}},[_c('span', with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("timing diagram")]),_v(" focuses on timing constraints.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingBehaviors/useCaseDiagrams/index.html b/book/modeling/modelingBehaviors/useCaseDiagrams/index.html index 830d4b9781..1552b7951f 100644 --- a/book/modeling/modelingBehaviors/useCaseDiagrams/index.html +++ b/book/modeling/modelingBehaviors/useCaseDiagrams/index.html @@ -13,7 +13,7 @@ +

    Use case diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingBehaviors/useCaseDiagrams/index.page-vue-render.js b/book/modeling/modelingBehaviors/useCaseDiagrams/index.page-vue-render.js index 0250fdbd04..89aa28f08b 100644 --- a/book/modeling/modelingBehaviors/useCaseDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingBehaviors/useCaseDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"use-case-diagrams"}},[_c('span with(this){return _c('p',[_c('strong',[_v("Use case diagrams model the mapping between "),_c('em',[_v("features")]),_v(" of a system and its user "),_c('em',[_v("roles")])]),_v(" i.e., which user roles can perform which tasks using the software.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/addingMoreInfo/index.html b/book/modeling/modelingStructures/addingMoreInfo/index.html index 51cb13c646..b724df9844 100644 --- a/book/modeling/modelingStructures/addingMoreInfo/index.html +++ b/book/modeling/modelingStructures/addingMoreInfo/index.html @@ -15,7 +15,7 @@ +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/addingMoreInfo/index.page-vue-render.js b/book/modeling/modelingStructures/addingMoreInfo/index.page-vue-render.js index 8d275bfa95..e4a21746dd 100644 --- a/book/modeling/modelingStructures/addingMoreInfo/index.page-vue-render.js +++ b/book/modeling/modelingStructures/addingMoreInfo/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"adding-more-info-to-uml-models with(this){return _c('p',[_c('strong',[_v("UML notes can be used to add more info to any UML model.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/classDiagramsAdvanced/index.html b/book/modeling/modelingStructures/classDiagramsAdvanced/index.html index 27971a95b1..5911998b68 100644 --- a/book/modeling/modelingStructures/classDiagramsAdvanced/index.html +++ b/book/modeling/modelingStructures/classDiagramsAdvanced/index.html @@ -17,7 +17,7 @@ Loading...

    UML → Class Diagrams → Association Classes → What

    Loading... -


    Exercises:

    Draw class diagram: Player, Bot, etc.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    Draw class diagram: Player, Bot, etc.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/classDiagramsAdvanced/index.page-vue-render.js b/book/modeling/modelingStructures/classDiagramsAdvanced/index.page-vue-render.js index 50c491970e..a8d858fcef 100644 --- a/book/modeling/modelingStructures/classDiagramsAdvanced/index.page-vue-render.js +++ b/book/modeling/modelingStructures/classDiagramsAdvanced/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("A class diagram can show association with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/classDiagramsBasic/index.html b/book/modeling/modelingStructures/classDiagramsBasic/index.html index 197d877164..00ea3e3f6a 100644 --- a/book/modeling/modelingStructures/classDiagramsBasic/index.html +++ b/book/modeling/modelingStructures/classDiagramsBasic/index.html @@ -37,7 +37,7 @@ Loading...

    UML Class Diagrams → Associations → Multiplicity

    Loading... -

    Here is the same class diagram shown earlier but with some additional information included:


    Exercises:

    Which association notations are shown?


    Explain Class Diagram


    Draw Class Diagram for Box etc.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Here is the same class diagram shown earlier but with some additional information included:


    Exercises:

    Which association notations are shown?


    Explain Class Diagram


    Draw Class Diagram for Box etc.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/classDiagramsBasic/index.page-vue-render.js b/book/modeling/modelingStructures/classDiagramsBasic/index.page-vue-render.js index 91d6552de8..da3a12b16b 100644 --- a/book/modeling/modelingStructures/classDiagramsBasic/index.page-vue-render.js +++ b/book/modeling/modelingStructures/classDiagramsBasic/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_v("In addition, "),_c('strong',[_v("associations can with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/classDiagramsIntermediate/index.html b/book/modeling/modelingStructures/classDiagramsIntermediate/index.html index 91184a52d4..fe98ff550b 100644 --- a/book/modeling/modelingStructures/classDiagramsIntermediate/index.html +++ b/book/modeling/modelingStructures/classDiagramsIntermediate/index.html @@ -41,7 +41,7 @@ Loading...

    UML → Class Diagrams → Interfaces → What

    Loading... -


    Exercises:

    Statements about class diagrams


    Explain notations in the class diagram


    Draw a Class Diagram for the code (StockItem, Inventory, Review, etc.)


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    Statements about class diagrams


    Explain notations in the class diagram


    Draw a Class Diagram for the code (StockItem, Inventory, Review, etc.)


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/classDiagramsIntermediate/index.page-vue-render.js b/book/modeling/modelingStructures/classDiagramsIntermediate/index.page-vue-render.js index 4244647287..9e4779797b 100644 --- a/book/modeling/modelingStructures/classDiagramsIntermediate/index.page-vue-render.js +++ b/book/modeling/modelingStructures/classDiagramsIntermediate/index.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('h5',{attrs:{"id":"modeling-interfaces"}},[_v("Modeling int with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/componentDiagrams/index.html b/book/modeling/modelingStructures/componentDiagrams/index.html index 042ece5c23..afa6175831 100644 --- a/book/modeling/modelingStructures/componentDiagrams/index.html +++ b/book/modeling/modelingStructures/componentDiagrams/index.html @@ -13,7 +13,7 @@ +

    Component diagrams

    A component diagram is used to show how a system is divided into components and how they are connected to each other through interfaces.

    An example component diagram:


    source:https://commons.wikimedia.org

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/componentDiagrams/index.page-vue-render.js b/book/modeling/modelingStructures/componentDiagrams/index.page-vue-render.js index 89d6adc8a2..72688f4bb1 100644 --- a/book/modeling/modelingStructures/componentDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingStructures/componentDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"component-diagrams"}},[_c('spa with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("component diagram")]),_v(" is used to show how a system is divided into components and how they are connected to each other through interfaces.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/compositeStructureDiagrams/index.html b/book/modeling/modelingStructures/compositeStructureDiagrams/index.html index e22bb46f5c..2dd93de73d 100644 --- a/book/modeling/modelingStructures/compositeStructureDiagrams/index.html +++ b/book/modeling/modelingStructures/compositeStructureDiagrams/index.html @@ -13,7 +13,7 @@ +

    Composite structure diagrams

    A composite structure diagram hierarchically decomposes a class into its internal structure.

    Here is an example composite structure diagram:


    source:https://commons.wikimedia.org

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/compositeStructureDiagrams/index.page-vue-render.js b/book/modeling/modelingStructures/compositeStructureDiagrams/index.page-vue-render.js index 5b5e9a79b9..a20f8bb12e 100644 --- a/book/modeling/modelingStructures/compositeStructureDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingStructures/compositeStructureDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"composite-structure-diagrams"} with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("composite structure diagram")]),_v(" hierarchically decomposes a class into its internal structure.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/deploymentDiagrams/index.html b/book/modeling/modelingStructures/deploymentDiagrams/index.html index e7e529566e..0ec60dcb72 100644 --- a/book/modeling/modelingStructures/deploymentDiagrams/index.html +++ b/book/modeling/modelingStructures/deploymentDiagrams/index.html @@ -13,7 +13,7 @@ +

    Deployment diagrams

    A deployment diagram shows a system's physical layout, revealing which pieces of software run on which pieces of hardware.

    An example deployment diagram:

    source:https://commons.wikimedia.org

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/deploymentDiagrams/index.page-vue-render.js b/book/modeling/modelingStructures/deploymentDiagrams/index.page-vue-render.js index f4ca0e657a..905e713730 100644 --- a/book/modeling/modelingStructures/deploymentDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingStructures/deploymentDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"deployment-diagrams"}},[_c('sp with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("deployment diagram")]),_v(" shows a system's physical layout, revealing which pieces of software run on which pieces of hardware.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/index.html b/book/modeling/modelingStructures/index.html index 3bd75750a7..4c54acc532 100644 --- a/book/modeling/modelingStructures/index.html +++ b/book/modeling/modelingStructures/index.html @@ -77,7 +77,7 @@ Loading...

    UML → Object Diagrams → Associations

    Loading... -


    Exercises:

    Draw an Object Diagram for Box etc.



    Conceptual Class Diagrams (aka OODMs)

    Can explain object oriented domain models

    The analysis process for identifying objects and object classes is recognized as one of the most difficult areas of object-oriented development. --Ian Sommerville, in the book Software Engineering

    Sidebar: Domain Modeling

    Domain modeling is modeling the i.e. to model how things actually work in the real world. Domain modeling is useful in understanding the problem domain, which is essential to the success of a project.

    Domain modeling can be done using,

    • a domain-specific modeling notation if such a notation exists (e.g., a modeling notation specific to the banking domain might have elements to represent loans, accounts, transactions etc.),
    • or a general purpose modeling notation, such as UML (e.g., you can use an activity diagram to model the workflow of processing a loan application),
    • or even other general purpose notations (e.g., you can use an organization chart to model the employee hierarchy of a company).

    When building an OOP system, it makes sense to build OOP models of the problem domain, given OOP aspires to emulate the objects in the real world.

    The UML model that captures class structures in the problem domain are called conceptual class diagrams. They are in fact a lighter version of class diagrams, and sometimes also called OO domain models (OODMs). The latter name is somewhat misleading as conceptual class diagrams (CCDs) are actually only one type of domain models that can model an OOP problem domain.

    The CCD of a snakes and ladders game is given below.

    Description: The snakes and ladders game is played by two or more players using a board and a die. The board has 100 squares marked 1 to 100. Each player owns one piece. Players take turns to throw the die and advance their piece by the number of squares they earned from the die throw. The board has a number of snakes. If a player’s piece lands on a square with a snake head, the piece is automatically moved to the square containing the snake’s tail. Similarly, a piece can automatically move from a ladder foot to the ladder top. The player whose piece is the first to reach the 100th square wins.

    CCDs do not contain solution-specific classes (i.e. classes that are used in the solution domain but do not exist in the problem domain). For example, a class called DatabaseConnection could appear in a class diagram but not usually in a CCD because DatabaseConnection is something related to a software solution but not an entity in the problem domain.

    CCDs represents the class structure of the problem domain and not their behavior, just like class diagrams. To show behavior, use other diagrams such as sequence diagrams.

    CCD notation is a subset of the class diagram notation (omits methods and navigability).


    Exercises:

    This diagram is,...


    Difference between a class diagram and CCD?



    Deployment diagrams

    Can explain deployment diagrams

    A deployment diagram shows a system's physical layout, revealing which pieces of software run on which pieces of hardware.

    An example deployment diagram:

    source:https://commons.wikimedia.org


    Component diagrams

    Can explain component diagrams

    A component diagram is used to show how a system is divided into components and how they are connected to each other through interfaces.

    An example component diagram:


    source:https://commons.wikimedia.org


    Package diagrams

    Can explain package diagrams

    A package diagram shows packages and their dependencies. A package is a grouping construct for grouping UML elements (classes, use cases, etc.).

    Here is an example package diagram:


    source:https://commons.wikimedia.org


    Composite structure diagrams

    Can explain composite structure diagrams

    A composite structure diagram hierarchically decomposes a class into its internal structure.

    Here is an example composite structure diagram:


    source:https://commons.wikimedia.org


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    Draw an Object Diagram for Box etc.



    Conceptual Class Diagrams (aka OODMs)

    Can explain object oriented domain models

    The analysis process for identifying objects and object classes is recognized as one of the most difficult areas of object-oriented development. --Ian Sommerville, in the book Software Engineering

    Sidebar: Domain Modeling

    Domain modeling is modeling the i.e. to model how things actually work in the real world. Domain modeling is useful in understanding the problem domain, which is essential to the success of a project.

    Domain modeling can be done using,

    • a domain-specific modeling notation if such a notation exists (e.g., a modeling notation specific to the banking domain might have elements to represent loans, accounts, transactions etc.),
    • or a general purpose modeling notation, such as UML (e.g., you can use an activity diagram to model the workflow of processing a loan application),
    • or even other general purpose notations (e.g., you can use an organization chart to model the employee hierarchy of a company).

    When building an OOP system, it makes sense to build OOP models of the problem domain, given OOP aspires to emulate the objects in the real world.

    The UML model that captures class structures in the problem domain are called conceptual class diagrams. They are in fact a lighter version of class diagrams, and sometimes also called OO domain models (OODMs). The latter name is somewhat misleading as conceptual class diagrams (CCDs) are actually only one type of domain models that can model an OOP problem domain.

    The CCD of a snakes and ladders game is given below.

    Description: The snakes and ladders game is played by two or more players using a board and a die. The board has 100 squares marked 1 to 100. Each player owns one piece. Players take turns to throw the die and advance their piece by the number of squares they earned from the die throw. The board has a number of snakes. If a player’s piece lands on a square with a snake head, the piece is automatically moved to the square containing the snake’s tail. Similarly, a piece can automatically move from a ladder foot to the ladder top. The player whose piece is the first to reach the 100th square wins.

    CCDs do not contain solution-specific classes (i.e. classes that are used in the solution domain but do not exist in the problem domain). For example, a class called DatabaseConnection could appear in a class diagram but not usually in a CCD because DatabaseConnection is something related to a software solution but not an entity in the problem domain.

    CCDs represents the class structure of the problem domain and not their behavior, just like class diagrams. To show behavior, use other diagrams such as sequence diagrams.

    CCD notation is a subset of the class diagram notation (omits methods and navigability).


    Exercises:

    This diagram is,...


    Difference between a class diagram and CCD?



    Deployment diagrams

    Can explain deployment diagrams

    A deployment diagram shows a system's physical layout, revealing which pieces of software run on which pieces of hardware.

    An example deployment diagram:

    source:https://commons.wikimedia.org


    Component diagrams

    Can explain component diagrams

    A component diagram is used to show how a system is divided into components and how they are connected to each other through interfaces.

    An example component diagram:


    source:https://commons.wikimedia.org


    Package diagrams

    Can explain package diagrams

    A package diagram shows packages and their dependencies. A package is a grouping construct for grouping UML elements (classes, use cases, etc.).

    Here is an example package diagram:


    source:https://commons.wikimedia.org


    Composite structure diagrams

    Can explain composite structure diagrams

    A composite structure diagram hierarchically decomposes a class into its internal structure.

    Here is an example composite structure diagram:


    source:https://commons.wikimedia.org


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/index.page-vue-render.js b/book/modeling/modelingStructures/index.page-vue-render.js index 4f7302ff5f..dddf5b4953 100644 --- a/book/modeling/modelingStructures/index.page-vue-render.js +++ b/book/modeling/modelingStructures/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"modeling-structures"}},[_c('span',[_v("Modeling structures")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#modeling-structures","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/objectDiagrams/index.html b/book/modeling/modelingStructures/objectDiagrams/index.html index ba52c6a767..6613f0612b 100644 --- a/book/modeling/modelingStructures/objectDiagrams/index.html +++ b/book/modeling/modelingStructures/objectDiagrams/index.html @@ -19,7 +19,7 @@ Loading...

    UML → Object Diagrams → Associations

    Loading... -


    Exercises:

    Draw an Object Diagram for Box etc.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Exercises:

    Draw an Object Diagram for Box etc.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/objectDiagrams/index.page-vue-render.js b/book/modeling/modelingStructures/objectDiagrams/index.page-vue-render.js index 8b5633aed6..18ca47f4b0 100644 --- a/book/modeling/modelingStructures/objectDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingStructures/objectDiagrams/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Object diagrams can be used to comple with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/objectOrientedDomainModels/index.html b/book/modeling/modelingStructures/objectOrientedDomainModels/index.html index 85eba766e4..c999b3514c 100644 --- a/book/modeling/modelingStructures/objectOrientedDomainModels/index.html +++ b/book/modeling/modelingStructures/objectOrientedDomainModels/index.html @@ -13,7 +13,7 @@

    Can explain object oriented domain models

    Design → Modelling → Modelling Structure → -

    Conceptual Class Diagrams (aka OODMs)

    The analysis process for identifying objects and object classes is recognized as one of the most difficult areas of object-oriented development. --Ian Sommerville, in the book Software Engineering

    Sidebar: Domain Modeling

    Domain modeling is modeling the i.e. to model how things actually work in the real world. Domain modeling is useful in understanding the problem domain, which is essential to the success of a project.

    Domain modeling can be done using,

    • a domain-specific modeling notation if such a notation exists (e.g., a modeling notation specific to the banking domain might have elements to represent loans, accounts, transactions etc.),
    • or a general purpose modeling notation, such as UML (e.g., you can use an activity diagram to model the workflow of processing a loan application),
    • or even other general purpose notations (e.g., you can use an organization chart to model the employee hierarchy of a company).

    When building an OOP system, it makes sense to build OOP models of the problem domain, given OOP aspires to emulate the objects in the real world.

    The UML model that captures class structures in the problem domain are called conceptual class diagrams. They are in fact a lighter version of class diagrams, and sometimes also called OO domain models (OODMs). The latter name is somewhat misleading as conceptual class diagrams (CCDs) are actually only one type of domain models that can model an OOP problem domain.

    The CCD of a snakes and ladders game is given below.

    Description: The snakes and ladders game is played by two or more players using a board and a die. The board has 100 squares marked 1 to 100. Each player owns one piece. Players take turns to throw the die and advance their piece by the number of squares they earned from the die throw. The board has a number of snakes. If a player’s piece lands on a square with a snake head, the piece is automatically moved to the square containing the snake’s tail. Similarly, a piece can automatically move from a ladder foot to the ladder top. The player whose piece is the first to reach the 100th square wins.

    CCDs do not contain solution-specific classes (i.e. classes that are used in the solution domain but do not exist in the problem domain). For example, a class called DatabaseConnection could appear in a class diagram but not usually in a CCD because DatabaseConnection is something related to a software solution but not an entity in the problem domain.

    CCDs represents the class structure of the problem domain and not their behavior, just like class diagrams. To show behavior, use other diagrams such as sequence diagrams.

    CCD notation is a subset of the class diagram notation (omits methods and navigability).


    Exercises:

    This diagram is,...


    Difference between a class diagram and CCD?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Conceptual Class Diagrams (aka OODMs)

    The analysis process for identifying objects and object classes is recognized as one of the most difficult areas of object-oriented development. --Ian Sommerville, in the book Software Engineering

    Sidebar: Domain Modeling

    Domain modeling is modeling the i.e. to model how things actually work in the real world. Domain modeling is useful in understanding the problem domain, which is essential to the success of a project.

    Domain modeling can be done using,

    • a domain-specific modeling notation if such a notation exists (e.g., a modeling notation specific to the banking domain might have elements to represent loans, accounts, transactions etc.),
    • or a general purpose modeling notation, such as UML (e.g., you can use an activity diagram to model the workflow of processing a loan application),
    • or even other general purpose notations (e.g., you can use an organization chart to model the employee hierarchy of a company).

    When building an OOP system, it makes sense to build OOP models of the problem domain, given OOP aspires to emulate the objects in the real world.

    The UML model that captures class structures in the problem domain are called conceptual class diagrams. They are in fact a lighter version of class diagrams, and sometimes also called OO domain models (OODMs). The latter name is somewhat misleading as conceptual class diagrams (CCDs) are actually only one type of domain models that can model an OOP problem domain.

    The CCD of a snakes and ladders game is given below.

    Description: The snakes and ladders game is played by two or more players using a board and a die. The board has 100 squares marked 1 to 100. Each player owns one piece. Players take turns to throw the die and advance their piece by the number of squares they earned from the die throw. The board has a number of snakes. If a player’s piece lands on a square with a snake head, the piece is automatically moved to the square containing the snake’s tail. Similarly, a piece can automatically move from a ladder foot to the ladder top. The player whose piece is the first to reach the 100th square wins.

    CCDs do not contain solution-specific classes (i.e. classes that are used in the solution domain but do not exist in the problem domain). For example, a class called DatabaseConnection could appear in a class diagram but not usually in a CCD because DatabaseConnection is something related to a software solution but not an entity in the problem domain.

    CCDs represents the class structure of the problem domain and not their behavior, just like class diagrams. To show behavior, use other diagrams such as sequence diagrams.

    CCD notation is a subset of the class diagram notation (omits methods and navigability).


    Exercises:

    This diagram is,...


    Difference between a class diagram and CCD?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/objectOrientedDomainModels/index.page-vue-render.js b/book/modeling/modelingStructures/objectOrientedDomainModels/index.page-vue-render.js index 84fe4afab7..b20e833e59 100644 --- a/book/modeling/modelingStructures/objectOrientedDomainModels/index.page-vue-render.js +++ b/book/modeling/modelingStructures/objectOrientedDomainModels/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("CCD notation is a subset of the class with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/ooStructures/index.html b/book/modeling/modelingStructures/ooStructures/index.html index ad4ab180d8..0fe11f9387 100644 --- a/book/modeling/modelingStructures/ooStructures/index.html +++ b/book/modeling/modelingStructures/ooStructures/index.html @@ -13,7 +13,7 @@

    Can explain structure modeling of OO solutions

    Design → Modelling → Modelling Structure → -

    OO structures

    An OO solution is basically a network of objects interacting with each other. Therefore, it is useful to be able to model how the relevant objects are 'networked' together inside a software i.e. how the objects are connected together.

    Given below is an illustration of some objects and how they are connected together. Note: the diagram uses an ad-hoc notation.

    Note that these object structures within the same software can change over time.

    Given below is how the object structure in the previous example could have looked like at a different time.

    However, object structures do not change at random; they change based on a set of rules set by the designer of that software. Those rules that object structures need to follow can be illustrated as a class structure i.e. a structure that exists among the relevant classes.

    Here is a class structure (drawn using an ad-hoc notation) that matches the object structures given in the previous two examples. For example, note how this class structure does not allow any connection between Genre objects and Author objects, a rule followed by the two object structures above.

    UML Object Diagrams model object structures. UML Class Diagrams model class structures.

    Here is an object diagram for the above example:

    And here is the class diagram for it:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    OO structures

    An OO solution is basically a network of objects interacting with each other. Therefore, it is useful to be able to model how the relevant objects are 'networked' together inside a software i.e. how the objects are connected together.

    Given below is an illustration of some objects and how they are connected together. Note: the diagram uses an ad-hoc notation.

    Note that these object structures within the same software can change over time.

    Given below is how the object structure in the previous example could have looked like at a different time.

    However, object structures do not change at random; they change based on a set of rules set by the designer of that software. Those rules that object structures need to follow can be illustrated as a class structure i.e. a structure that exists among the relevant classes.

    Here is a class structure (drawn using an ad-hoc notation) that matches the object structures given in the previous two examples. For example, note how this class structure does not allow any connection between Genre objects and Author objects, a rule followed by the two object structures above.

    UML Object Diagrams model object structures. UML Class Diagrams model class structures.

    Here is an object diagram for the above example:

    And here is the class diagram for it:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/ooStructures/index.page-vue-render.js b/book/modeling/modelingStructures/ooStructures/index.page-vue-render.js index c67acd56eb..8514ea0c7b 100644 --- a/book/modeling/modelingStructures/ooStructures/index.page-vue-render.js +++ b/book/modeling/modelingStructures/ooStructures/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("UML "),_c('em',[_v("Object Diagrams") with(this){return _c('div',[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/modeling/modelingStructures/packageDiagrams/index.html b/book/modeling/modelingStructures/packageDiagrams/index.html index 7c09a13bdd..12badfb59a 100644 --- a/book/modeling/modelingStructures/packageDiagrams/index.html +++ b/book/modeling/modelingStructures/packageDiagrams/index.html @@ -13,7 +13,7 @@ +

    Package diagrams

    A package diagram shows packages and their dependencies. A package is a grouping construct for grouping UML elements (classes, use cases, etc.).

    Here is an example package diagram:


    source:https://commons.wikimedia.org

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/modeling/modelingStructures/packageDiagrams/index.page-vue-render.js b/book/modeling/modelingStructures/packageDiagrams/index.page-vue-render.js index eaa0309129..b47c074090 100644 --- a/book/modeling/modelingStructures/packageDiagrams/index.page-vue-render.js +++ b/book/modeling/modelingStructures/packageDiagrams/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"package-diagrams"}},[_c('span' with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("package diagram")]),_v(" shows packages and their dependencies.")]),_v(" A package is a grouping construct for grouping UML elements (classes, use cases, etc.).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/aggregation/index.html b/book/oop/associations/aggregation/index.html index 07cd29fb82..f512ebb767 100644 --- a/book/oop/associations/aggregation/index.html +++ b/book/oop/associations/aggregation/index.html @@ -97,7 +97,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/aggregation/index.page-vue-render.js b/book/oop/associations/aggregation/index.page-vue-render.js index 1e71c3ff79..6431b5ba36 100644 --- a/book/oop/associations/aggregation/index.page-vue-render.js +++ b/book/oop/associations/aggregation/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('h5',{attrs:{"id":"implementing-aggregation"}},[_v("Impleme with(this){return _c('p',[_v("Implementation is similar to that of composition except the "),_c('em',[_v("containee")]),_v(" object can exist even after the "),_c('em',[_v("container")]),_v(" object is deleted.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/associationClasses/index.html b/book/oop/associations/associationClasses/index.html index 89851e5b42..60d265b4c8 100644 --- a/book/oop/associations/associationClasses/index.html +++ b/book/oop/associations/associationClasses/index.html @@ -60,7 +60,7 @@ -

    Exercises:

    Which are suitable as an Association Class?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exercises:

    Which are suitable as an Association Class?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/associationClasses/index.page-vue-render.js b/book/oop/associations/associationClasses/index.page-vue-render.js index dd6f766a5e..8f78c55f1f 100644 --- a/book/oop/associations/associationClasses/index.page-vue-render.js +++ b/book/oop/associations/associationClasses/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('h5',{attrs:{"id":"implementing-association-classes"}},[_v( with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/composition/index.html b/book/oop/associations/composition/index.html index 6004082f31..297e62ef5b 100644 --- a/book/oop/associations/composition/index.html +++ b/book/oop/associations/composition/index.html @@ -91,7 +91,7 @@ -

    In this code, the Email has a composition type relationship with the Subject class, in the sense that the subject is part of the email.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    In this code, the Email has a composition type relationship with the Subject class, in the sense that the subject is part of the email.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/composition/index.page-vue-render.js b/book/oop/associations/composition/index.page-vue-render.js index 50a527d036..dfa1abcc21 100644 --- a/book/oop/associations/composition/index.page-vue-render.js +++ b/book/oop/associations/composition/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('h5',{attrs:{"id":"implementing-composition"}},[_v("Impleme with(this){return _c('p',[_c('strong',[_v("Composition is implemented using a normal variable.")]),_v(" If correctly implemented, the ‘part’ object will be deleted when the ‘whole’ object is deleted. Ideally, the ‘part’ object may not even be visible to clients of the ‘whole’ object.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/dependencies/index.html b/book/oop/associations/dependencies/index.html index 96b542bbb8..dc73eccfcf 100644 --- a/book/oop/associations/dependencies/index.html +++ b/book/oop/associations/dependencies/index.html @@ -106,7 +106,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/dependencies/index.page-vue-render.js b/book/oop/associations/dependencies/index.page-vue-render.js index 7a9f5e95e1..ad8c0012f1 100644 --- a/book/oop/associations/dependencies/index.page-vue-render.js +++ b/book/oop/associations/dependencies/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"dependencies"}},[_c('span',[_v with(this){return _c('p',[_v("In the context of OOP associations, "),_c('strong',[_v("a "),_c('em',[_v("dependency")]),_v(" is a need for one class to depend on another without having a direct association in the same direction.")]),_v(" Reason for the exclusion: If there is an association from class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Foo")]),_v(" to class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bar")]),_v(" (i.e., navigable from "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Foo")]),_v(" to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bar")]),_v("), that means "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Foo")]),_v(" is "),_c('em',[_v("obviously")]),_v(" dependent on "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bar")]),_v(" and hence there is no point in mentioning "),_c('em',[_v("dependency")]),_v(" specifically. In other words, we are specifically focusing on "),_c('em',[_v("non-obvious")]),_v(" dependencies here. One cause of such dependencies is interactions between objects that do not have a long-term link between them.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/index.html b/book/oop/associations/index.html index bdde01f34f..59fc517c22 100644 --- a/book/oop/associations/index.html +++ b/book/oop/associations/index.html @@ -699,7 +699,7 @@ -

    Exercises:

    Which are suitable as an Association Class?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exercises:

    Which are suitable as an Association Class?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/index.page-vue-render.js b/book/oop/associations/index.page-vue-render.js index aa9a9892fe..487ba31048 100644 --- a/book/oop/associations/index.page-vue-render.js +++ b/book/oop/associations/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"associations"}},[_c('span',[_v("Associations")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#associations","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/multiplicity/index.html b/book/oop/associations/multiplicity/index.html index 33c905ecfd..7ca275c545 100644 --- a/book/oop/associations/multiplicity/index.html +++ b/book/oop/associations/multiplicity/index.html @@ -218,7 +218,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/multiplicity/index.page-vue-render.js b/book/oop/associations/multiplicity/index.page-vue-render.js index 6c438b27b3..6ef1c36515 100644 --- a/book/oop/associations/multiplicity/index.page-vue-render.js +++ b/book/oop/associations/multiplicity/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("A variable can be used to implement a with(this){return _c('p',[_c('strong',[_v("To implement other multiplicities, choose a suitable data structure")]),_v(" such as Arrays, ArrayLists, HashMaps, Sets, etc.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/navigability/index.html b/book/oop/associations/navigability/index.html index 741a2c19fb..03121ca967 100644 --- a/book/oop/associations/navigability/index.html +++ b/book/oop/associations/navigability/index.html @@ -192,7 +192,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/navigability/index.page-vue-render.js b/book/oop/associations/navigability/index.page-vue-render.js index e4ef955406..837a282d46 100644 --- a/book/oop/associations/navigability/index.page-vue-render.js +++ b/book/oop/associations/navigability/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Navigability can be "),_c('em',[_v("u with(this){return _c('ul',[_c('li',[_c('strong',[_v("Unidirectional")]),_v(": If the navigability is from "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Box")]),_v(" to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Rope")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(" will have a reference to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" will not have a reference to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(". That is, one can "),_c('em',[_v("navigate")]),_v(" from "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(" to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v("'s object reference of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" (but not in the other direction)."),_c('br'),_v("\nSimilarly, if the navigability is in the other direction, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" will have a reference to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(" but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(" will not have a reference to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Bidirectional")]),_v(": "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(" will have a reference to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("r")]),_v(" will have a reference to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("b")]),_v(" i.e., the two objects will be pointing to each other for the same single instance of the association.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/associations/what/index.html b/book/oop/associations/what/index.html index 106a0c5b8f..423e6b6bdf 100644 --- a/book/oop/associations/what/index.html +++ b/book/oop/associations/what/index.html @@ -13,7 +13,7 @@

    Can explain associations

    Paradigms → OOP → Associations → -

    Basic

    Objects in an OO solution need to be connected to each other to form a network so that they can interact with each other. Such connections between objects are called associations.

    Suppose an OOP program for managing a learning management system creates an object structure to represent the related objects. In that object structure you can expect to have associations between a Course object that represents a specific course and Student objects that represent students taking that course.

    Associations in an object structure can change over time.

    To continue the previous example, the associations between a Course object and Student objects can change as students enroll in the course or drop the course over time.

    Associations among objects can be generalized as associations between the corresponding classes too.

    In our example, as some Course objects can have associations with some Student objects, you can view it as an association between the Course class and the Student class.

    Implementing associations

    You use instance level variables to implement associations.

    In our example, the Course class can have a students variable to keeps track of students associated with a particular course.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Basic

    Objects in an OO solution need to be connected to each other to form a network so that they can interact with each other. Such connections between objects are called associations.

    Suppose an OOP program for managing a learning management system creates an object structure to represent the related objects. In that object structure you can expect to have associations between a Course object that represents a specific course and Student objects that represent students taking that course.

    Associations in an object structure can change over time.

    To continue the previous example, the associations between a Course object and Student objects can change as students enroll in the course or drop the course over time.

    Associations among objects can be generalized as associations between the corresponding classes too.

    In our example, as some Course objects can have associations with some Student objects, you can view it as an association between the Course class and the Student class.

    Implementing associations

    You use instance level variables to implement associations.

    In our example, the Course class can have a students variable to keeps track of students associated with a particular course.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/associations/what/index.page-vue-render.js b/book/oop/associations/what/index.page-vue-render.js index 9e64a886ef..d4afbb8801 100644 --- a/book/oop/associations/what/index.page-vue-render.js +++ b/book/oop/associations/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('h5',{attrs:{"id":"implementing-associations"}},[_v("Implem with(this){return _c('p',[_c('strong',[_v("You use instance level variables to implement associations.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/classes/classLevelMembers/index.html b/book/oop/classes/classLevelMembers/index.html index b66ad02eb8..6fa1e47758 100644 --- a/book/oop/classes/classLevelMembers/index.html +++ b/book/oop/classes/classLevelMembers/index.html @@ -13,7 +13,7 @@

    Can explain class-level members

    Paradigms → OOP → Classes → -

    Class-level members

    While all objects of a class have the same attributes, each object has its own copy of the attribute value.

    All Person objects have the name attribute but the value of that attribute varies between Person objects.

    However, some attributes are not suitable to be maintained by individual objects. Instead, they should be maintained centrally, shared by all objects of the class. They are like ‘global variables’ but attached to a specific class. Such variables whose value is shared by all instances of a class are called class-level attributes.

    The attribute totalPersons should be maintained centrally and shared by all Person objects rather than copied at each Person object.

    Similarly, when a normal method is being called, a message is being sent to the receiving object and the result may depend on the receiving object.

    Sending the getName() message to the Adam object results in the response "Adam" while sending the same message to the Beth object results in the response "Beth".

    However, there can be methods related to a specific class but not suitable for sending messages to a specific object of that class. Such methods that are called using the class instead of a specific instance are called class-level methods.

    The method getTotalPersons() is not suitable to send to a specific Person object because a specific object of the Person class should not have to know about the total number of Person objects.

    Class-level attributes and methods are collectively called class-level members (also called static members sometimes because some programming languages use the keyword static to identify class-level members). They are to be accessed using the class name rather than an instance of the class.


    Exercises:

    Suitable as class-level variables


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Class-level members

    While all objects of a class have the same attributes, each object has its own copy of the attribute value.

    All Person objects have the name attribute but the value of that attribute varies between Person objects.

    However, some attributes are not suitable to be maintained by individual objects. Instead, they should be maintained centrally, shared by all objects of the class. They are like ‘global variables’ but attached to a specific class. Such variables whose value is shared by all instances of a class are called class-level attributes.

    The attribute totalPersons should be maintained centrally and shared by all Person objects rather than copied at each Person object.

    Similarly, when a normal method is being called, a message is being sent to the receiving object and the result may depend on the receiving object.

    Sending the getName() message to the Adam object results in the response "Adam" while sending the same message to the Beth object results in the response "Beth".

    However, there can be methods related to a specific class but not suitable for sending messages to a specific object of that class. Such methods that are called using the class instead of a specific instance are called class-level methods.

    The method getTotalPersons() is not suitable to send to a specific Person object because a specific object of the Person class should not have to know about the total number of Person objects.

    Class-level attributes and methods are collectively called class-level members (also called static members sometimes because some programming languages use the keyword static to identify class-level members). They are to be accessed using the class name rather than an instance of the class.


    Exercises:

    Suitable as class-level variables


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/classes/classLevelMembers/index.page-vue-render.js b/book/oop/classes/classLevelMembers/index.page-vue-render.js index 111c16233c..bf68d305fc 100644 --- a/book/oop/classes/classLevelMembers/index.page-vue-render.js +++ b/book/oop/classes/classLevelMembers/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("Class-level attributes and methods ar with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/classes/enumerations/index.html b/book/oop/classes/enumerations/index.html index 12baa803fc..dcb537ef72 100644 --- a/book/oop/classes/enumerations/index.html +++ b/book/oop/classes/enumerations/index.html @@ -13,7 +13,7 @@

    Can explain the meaning of enumerations

    Paradigms → OOP → Classes → -

    Enumerations

    An Enumeration is a fixed set of values that can be considered as a data type. An enumeration is often useful when using a regular data type such as int or String would allow invalid values to be assigned to a variable.

    Suppose you want a variable called priority to store the priority of something. There are only three priority levels: high, medium, and low. You can declare the variable priority as of type int and use only values 2, 1, and 0 to indicate the three priority levels. However, this opens the possibility of an invalid value such as 9 being assigned to it. But if you define an enumeration type called Priority that has three values HIGH, MEDIUM and LOW only, a variable of type Priority will never be assigned an invalid value because the compiler is able to catch such an error.

    Priority: HIGH, MEDIUM, LOW

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Enumerations

    An Enumeration is a fixed set of values that can be considered as a data type. An enumeration is often useful when using a regular data type such as int or String would allow invalid values to be assigned to a variable.

    Suppose you want a variable called priority to store the priority of something. There are only three priority levels: high, medium, and low. You can declare the variable priority as of type int and use only values 2, 1, and 0 to indicate the three priority levels. However, this opens the possibility of an invalid value such as 9 being assigned to it. But if you define an enumeration type called Priority that has three values HIGH, MEDIUM and LOW only, a variable of type Priority will never be assigned an invalid value because the compiler is able to catch such an error.

    Priority: HIGH, MEDIUM, LOW

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/classes/enumerations/index.page-vue-render.js b/book/oop/classes/enumerations/index.page-vue-render.js index bf9e3cd0eb..bd22c8d148 100644 --- a/book/oop/classes/enumerations/index.page-vue-render.js +++ b/book/oop/classes/enumerations/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"enumerations"}},[_c('span',[_v with(this){return _c('p',[_c('strong',[_v("An "),_c('em',[_v("Enumeration")]),_v(" is a fixed set of values that can be considered as a data type.")]),_v(" An enumeration is often useful when using a regular data type such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("String")]),_v(" would allow invalid values to be assigned to a variable.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/classes/index.html b/book/oop/classes/index.html index 8d1ffb226b..db062e9e4e 100644 --- a/book/oop/classes/index.html +++ b/book/oop/classes/index.html @@ -13,7 +13,7 @@

    Paradigms → OOP → -

    Classes

    What

    Can explain the relationship between classes and objects

    Writing an OOP program is essentially writing instructions that the computer will use to,

    1. create the virtual world of the object network, and
    2. provide it the inputs to produce the outcome you want.

    A class contains instructions for creating a specific kind of objects. It turns out sometimes multiple objects keep the same type of data and have the same behavior because they are of the same kind. Instructions for creating a 'kind' (or ‘class’) of objects can be done once and those same instructions can be used to objects of that kind. We call such instructions a Class.

    Classes and objects in an example scenario

    Consider the example of writing an OOP program to calculate the average age of Adam, Beth, Charlie, and Daisy.

    Instructions for creating objects Adam, Beth, Charlie, and Daisy will be very similar because they are all of the same kind: they all represent ‘persons’ with the same interface, the same kind of data (i.e. name, dateOfBirth, etc.), and the same kind of behavior (i.e. getAge(Date), getName(), etc.). Therefore, you can have a class called Person containing instructions on how to create Person objects and use that class to instantiate objects Adam, Beth, Charlie, and Daisy.

    Similarly, you need classes AgeList, Calculator, and Main classes to instantiate one each of AgeList, Calculator, and Main objects.

    Class Objects
    Person objects representing Adam, Beth, Charlie, Daisy
    AgeList an object to represent the age list
    Calculator an object to do the calculations
    Main an object to represent you (i.e., the one who manages the whole operation)

    Exercises:

    Identify Classes and Objects


    Classes for CityConnect app



    Class-level members

    Can explain class-level members

    While all objects of a class have the same attributes, each object has its own copy of the attribute value.

    All Person objects have the name attribute but the value of that attribute varies between Person objects.

    However, some attributes are not suitable to be maintained by individual objects. Instead, they should be maintained centrally, shared by all objects of the class. They are like ‘global variables’ but attached to a specific class. Such variables whose value is shared by all instances of a class are called class-level attributes.

    The attribute totalPersons should be maintained centrally and shared by all Person objects rather than copied at each Person object.

    Similarly, when a normal method is being called, a message is being sent to the receiving object and the result may depend on the receiving object.

    Sending the getName() message to the Adam object results in the response "Adam" while sending the same message to the Beth object results in the response "Beth".

    However, there can be methods related to a specific class but not suitable for sending messages to a specific object of that class. Such methods that are called using the class instead of a specific instance are called class-level methods.

    The method getTotalPersons() is not suitable to send to a specific Person object because a specific object of the Person class should not have to know about the total number of Person objects.

    Class-level attributes and methods are collectively called class-level members (also called static members sometimes because some programming languages use the keyword static to identify class-level members). They are to be accessed using the class name rather than an instance of the class.


    Exercises:

    Suitable as class-level variables



    Enumerations

    Can explain the meaning of enumerations

    An Enumeration is a fixed set of values that can be considered as a data type. An enumeration is often useful when using a regular data type such as int or String would allow invalid values to be assigned to a variable.

    Suppose you want a variable called priority to store the priority of something. There are only three priority levels: high, medium, and low. You can declare the variable priority as of type int and use only values 2, 1, and 0 to indicate the three priority levels. However, this opens the possibility of an invalid value such as 9 being assigned to it. But if you define an enumeration type called Priority that has three values HIGH, MEDIUM and LOW only, a variable of type Priority will never be assigned an invalid value because the compiler is able to catch such an error.

    Priority: HIGH, MEDIUM, LOW


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Classes

    What

    Can explain the relationship between classes and objects

    Writing an OOP program is essentially writing instructions that the computer will use to,

    1. create the virtual world of the object network, and
    2. provide it the inputs to produce the outcome you want.

    A class contains instructions for creating a specific kind of objects. It turns out sometimes multiple objects keep the same type of data and have the same behavior because they are of the same kind. Instructions for creating a 'kind' (or ‘class’) of objects can be done once and those same instructions can be used to objects of that kind. We call such instructions a Class.

    Classes and objects in an example scenario

    Consider the example of writing an OOP program to calculate the average age of Adam, Beth, Charlie, and Daisy.

    Instructions for creating objects Adam, Beth, Charlie, and Daisy will be very similar because they are all of the same kind: they all represent ‘persons’ with the same interface, the same kind of data (i.e. name, dateOfBirth, etc.), and the same kind of behavior (i.e. getAge(Date), getName(), etc.). Therefore, you can have a class called Person containing instructions on how to create Person objects and use that class to instantiate objects Adam, Beth, Charlie, and Daisy.

    Similarly, you need classes AgeList, Calculator, and Main classes to instantiate one each of AgeList, Calculator, and Main objects.

    Class Objects
    Person objects representing Adam, Beth, Charlie, Daisy
    AgeList an object to represent the age list
    Calculator an object to do the calculations
    Main an object to represent you (i.e., the one who manages the whole operation)

    Exercises:

    Identify Classes and Objects


    Classes for CityConnect app



    Class-level members

    Can explain class-level members

    While all objects of a class have the same attributes, each object has its own copy of the attribute value.

    All Person objects have the name attribute but the value of that attribute varies between Person objects.

    However, some attributes are not suitable to be maintained by individual objects. Instead, they should be maintained centrally, shared by all objects of the class. They are like ‘global variables’ but attached to a specific class. Such variables whose value is shared by all instances of a class are called class-level attributes.

    The attribute totalPersons should be maintained centrally and shared by all Person objects rather than copied at each Person object.

    Similarly, when a normal method is being called, a message is being sent to the receiving object and the result may depend on the receiving object.

    Sending the getName() message to the Adam object results in the response "Adam" while sending the same message to the Beth object results in the response "Beth".

    However, there can be methods related to a specific class but not suitable for sending messages to a specific object of that class. Such methods that are called using the class instead of a specific instance are called class-level methods.

    The method getTotalPersons() is not suitable to send to a specific Person object because a specific object of the Person class should not have to know about the total number of Person objects.

    Class-level attributes and methods are collectively called class-level members (also called static members sometimes because some programming languages use the keyword static to identify class-level members). They are to be accessed using the class name rather than an instance of the class.


    Exercises:

    Suitable as class-level variables



    Enumerations

    Can explain the meaning of enumerations

    An Enumeration is a fixed set of values that can be considered as a data type. An enumeration is often useful when using a regular data type such as int or String would allow invalid values to be assigned to a variable.

    Suppose you want a variable called priority to store the priority of something. There are only three priority levels: high, medium, and low. You can declare the variable priority as of type int and use only values 2, 1, and 0 to indicate the three priority levels. However, this opens the possibility of an invalid value such as 9 being assigned to it. But if you define an enumeration type called Priority that has three values HIGH, MEDIUM and LOW only, a variable of type Priority will never be assigned an invalid value because the compiler is able to catch such an error.

    Priority: HIGH, MEDIUM, LOW


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/classes/index.page-vue-render.js b/book/oop/classes/index.page-vue-render.js index 475ae2a515..728015ffb4 100644 --- a/book/oop/classes/index.page-vue-render.js +++ b/book/oop/classes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"classes"}},[_c('span',[_v("Classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/classes/what/index.html b/book/oop/classes/what/index.html index 17d335781f..b639cb9a7f 100644 --- a/book/oop/classes/what/index.html +++ b/book/oop/classes/what/index.html @@ -13,7 +13,7 @@

    Can explain the relationship between classes and objects

    Paradigms → OOP → Classes → -

    What

    Writing an OOP program is essentially writing instructions that the computer will use to,

    1. create the virtual world of the object network, and
    2. provide it the inputs to produce the outcome you want.

    A class contains instructions for creating a specific kind of objects. It turns out sometimes multiple objects keep the same type of data and have the same behavior because they are of the same kind. Instructions for creating a 'kind' (or ‘class’) of objects can be done once and those same instructions can be used to objects of that kind. We call such instructions a Class.

    Classes and objects in an example scenario

    Consider the example of writing an OOP program to calculate the average age of Adam, Beth, Charlie, and Daisy.

    Instructions for creating objects Adam, Beth, Charlie, and Daisy will be very similar because they are all of the same kind: they all represent ‘persons’ with the same interface, the same kind of data (i.e. name, dateOfBirth, etc.), and the same kind of behavior (i.e. getAge(Date), getName(), etc.). Therefore, you can have a class called Person containing instructions on how to create Person objects and use that class to instantiate objects Adam, Beth, Charlie, and Daisy.

    Similarly, you need classes AgeList, Calculator, and Main classes to instantiate one each of AgeList, Calculator, and Main objects.

    Class Objects
    Person objects representing Adam, Beth, Charlie, Daisy
    AgeList an object to represent the age list
    Calculator an object to do the calculations
    Main an object to represent you (i.e., the one who manages the whole operation)

    Exercises:

    Identify Classes and Objects


    Classes for CityConnect app


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Writing an OOP program is essentially writing instructions that the computer will use to,

    1. create the virtual world of the object network, and
    2. provide it the inputs to produce the outcome you want.

    A class contains instructions for creating a specific kind of objects. It turns out sometimes multiple objects keep the same type of data and have the same behavior because they are of the same kind. Instructions for creating a 'kind' (or ‘class’) of objects can be done once and those same instructions can be used to objects of that kind. We call such instructions a Class.

    Classes and objects in an example scenario

    Consider the example of writing an OOP program to calculate the average age of Adam, Beth, Charlie, and Daisy.

    Instructions for creating objects Adam, Beth, Charlie, and Daisy will be very similar because they are all of the same kind: they all represent ‘persons’ with the same interface, the same kind of data (i.e. name, dateOfBirth, etc.), and the same kind of behavior (i.e. getAge(Date), getName(), etc.). Therefore, you can have a class called Person containing instructions on how to create Person objects and use that class to instantiate objects Adam, Beth, Charlie, and Daisy.

    Similarly, you need classes AgeList, Calculator, and Main classes to instantiate one each of AgeList, Calculator, and Main objects.

    Class Objects
    Person objects representing Adam, Beth, Charlie, Daisy
    AgeList an object to represent the age list
    Calculator an object to do the calculations
    Main an object to represent you (i.e., the one who manages the whole operation)

    Exercises:

    Identify Classes and Objects


    Classes for CityConnect app


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/classes/what/index.page-vue-render.js b/book/oop/classes/what/index.page-vue-render.js index 9008b114b1..f05dbf69ab 100644 --- a/book/oop/classes/what/index.page-vue-render.js +++ b/book/oop/classes/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('strong',[_v("A "),_c('mark',[_c('em',[_v("class")])]),_v(" with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/index.html b/book/oop/index.html index 95de97de9e..8cac26e45b 100644 --- a/book/oop/index.html +++ b/book/oop/index.html @@ -903,7 +903,7 @@ -


    Polymorphism

    What

    Can explain OOP polymorphism

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".


    How

    Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism




    More

    Miscellaneous

    Can answer frequently asked OOP questions

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.


    Review

    Can combine some OOP concepts

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Polymorphism

    What

    Can explain OOP polymorphism

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".


    How

    Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism




    More

    Miscellaneous

    Can answer frequently asked OOP questions

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.


    Review

    Can combine some OOP concepts

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/index.page-vue-render.js b/book/oop/index.page-vue-render.js index 6927c25919..633a1c620b 100644 --- a/book/oop/index.page-vue-render.js +++ b/book/oop/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"object-oriented-programming"}},[_c('span',[_v("Object-Oriented Programming")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#object-oriented-programming","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/abstractClasses/index.html b/book/oop/inheritance/abstractClasses/index.html index b0ec324d7e..bb2b657a82 100644 --- a/book/oop/inheritance/abstractClasses/index.html +++ b/book/oop/inheritance/abstractClasses/index.html @@ -13,7 +13,7 @@

    Can implement abstract classes

    Paradigms → OOP → Inheritance → -

    Abstract classes and methods

    Abstract class: A class declared as an abstract class cannot be instantiated, but it can be subclassed.

    You can declare a class as abstract when a class is merely a representation of commonalities among its subclasses in which case it does not make sense to instantiate objects of that class.

    The Animal class that exists as a generalization of its subclasses Cat, Dog, Horse, Tiger etc. can be declared as abstract because it does not make sense to instantiate an Animal object.

    Abstract method: An abstract method is a method signature without a method implementation.

    The move method of the Animal class is likely to be an abstract method as it is not possible to implement a move method at the Animal class level to fit all subclasses because each animal type can move in a different way.

    A class that has an abstract method becomes an abstract class because the class definition is incomplete (due to the missing method body) and it is not possible to create objects using an incomplete class definition.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Abstract classes and methods

    Abstract class: A class declared as an abstract class cannot be instantiated, but it can be subclassed.

    You can declare a class as abstract when a class is merely a representation of commonalities among its subclasses in which case it does not make sense to instantiate objects of that class.

    The Animal class that exists as a generalization of its subclasses Cat, Dog, Horse, Tiger etc. can be declared as abstract because it does not make sense to instantiate an Animal object.

    Abstract method: An abstract method is a method signature without a method implementation.

    The move method of the Animal class is likely to be an abstract method as it is not possible to implement a move method at the Animal class level to fit all subclasses because each animal type can move in a different way.

    A class that has an abstract method becomes an abstract class because the class definition is incomplete (due to the missing method body) and it is not possible to create objects using an incomplete class definition.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/abstractClasses/index.page-vue-render.js b/book/oop/inheritance/abstractClasses/index.page-vue-render.js index cc2be77084..cad5d0a1d5 100644 --- a/book/oop/inheritance/abstractClasses/index.page-vue-render.js +++ b/book/oop/inheritance/abstractClasses/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("You can declare a class as "),_c('em' with(this){return _c('p',[_c('strong',[_v("A class that has an abstract method becomes an abstract class")]),_v(" because the class definition is incomplete (due to the missing method body) and it is not possible to create objects using an incomplete class definition.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/dynamicAndStaticBinding/index.html b/book/oop/inheritance/dynamicAndStaticBinding/index.html index 16687d4c20..de5184a7eb 100644 --- a/book/oop/inheritance/dynamicAndStaticBinding/index.html +++ b/book/oop/inheritance/dynamicAndStaticBinding/index.html @@ -137,7 +137,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/dynamicAndStaticBinding/index.page-vue-render.js b/book/oop/inheritance/dynamicAndStaticBinding/index.page-vue-render.js index c56ca39005..02bfa6acd7 100644 --- a/book/oop/inheritance/dynamicAndStaticBinding/index.page-vue-render.js +++ b/book/oop/inheritance/dynamicAndStaticBinding/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"dynamic-and-static-binding"}},[_c('span',[_v("Dynamic and static binding")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dynamic-and-static-binding","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/index.html b/book/oop/inheritance/index.html index b0c0846f5e..8c569d4fb8 100644 --- a/book/oop/inheritance/index.html +++ b/book/oop/inheritance/index.html @@ -211,7 +211,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/index.page-vue-render.js b/book/oop/inheritance/index.page-vue-render.js index d55db13a88..6ff5ed9eb3 100644 --- a/book/oop/inheritance/index.page-vue-render.js +++ b/book/oop/inheritance/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"inheritance"}},[_c('span',[_v("Inheritance")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#inheritance","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/interfaces/index.html b/book/oop/inheritance/interfaces/index.html index c2cf53bc8b..7a6ce67d4e 100644 --- a/book/oop/inheritance/interfaces/index.html +++ b/book/oop/inheritance/interfaces/index.html @@ -13,7 +13,7 @@

    Can explain interfaces

    Paradigms → OOP → Inheritance → -

    Interfaces

    An interface is a behavior specification i.e. a collection of . If a class , it means the class is able to support the behaviors specified by the said interface.

    There are a number of situations in software engineering when it is important for disparate groups of programmers to agree to a "contract" that spells out how their software interacts. Each group should be able to write their code without any knowledge of how the other group's code is written. Generally speaking, interfaces are such contracts. --Oracle Docs on Java

    Suppose SalariedStaff is an interface that contains two methods setSalary(int) and getSalary(). AcademicStaff can declare itself as implementing the SalariedStaff interface, which means the AcademicStaff class must implement all the methods specified by the SalariedStaff interface i.e., setSalary(int) and getSalary().

    A class implementing an interface results in an is-a relationship, just like in class inheritance.

    In the example above, AcademicStaff is a SalariedStaff. An AcademicStaff object can be used anywhere a SalariedStaff object is expected e.g. SalariedStaff ss = new AcademicStaff().

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Interfaces

    An interface is a behavior specification i.e. a collection of . If a class , it means the class is able to support the behaviors specified by the said interface.

    There are a number of situations in software engineering when it is important for disparate groups of programmers to agree to a "contract" that spells out how their software interacts. Each group should be able to write their code without any knowledge of how the other group's code is written. Generally speaking, interfaces are such contracts. --Oracle Docs on Java

    Suppose SalariedStaff is an interface that contains two methods setSalary(int) and getSalary(). AcademicStaff can declare itself as implementing the SalariedStaff interface, which means the AcademicStaff class must implement all the methods specified by the SalariedStaff interface i.e., setSalary(int) and getSalary().

    A class implementing an interface results in an is-a relationship, just like in class inheritance.

    In the example above, AcademicStaff is a SalariedStaff. An AcademicStaff object can be used anywhere a SalariedStaff object is expected e.g. SalariedStaff ss = new AcademicStaff().

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/interfaces/index.page-vue-render.js b/book/oop/inheritance/interfaces/index.page-vue-render.js index 4589a2cc87..ad60da86c4 100644 --- a/book/oop/inheritance/interfaces/index.page-vue-render.js +++ b/book/oop/inheritance/interfaces/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('blockquote',[_c('p',[_v("There are a number of situations with(this){return _c('p',[_c('strong',[_v("A class implementing an interface results in an "),_c('em',[_v("is-a")]),_v(" relationship")]),_v(", just like in class inheritance.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/overloading/index.html b/book/oop/inheritance/overloading/index.html index f14ccd4d90..ca2590e3af 100644 --- a/book/oop/inheritance/overloading/index.html +++ b/book/oop/inheritance/overloading/index.html @@ -13,7 +13,7 @@

    Can explain method overloading

    Paradigms → OOP → Inheritance → -

    Overloading

    Method overloading is when there are multiple methods with the same name but different type signatures. Overloading is used to indicate that multiple operations do similar things but take different parameters.

    Type signature: The type signature of an operation is the type sequence of the parameters. The return type and parameter names are not part of the type signature. However, the parameter order is significant.

    Example:

    Method Type Signature
    int add(int X, int Y) (int, int)
    void add(int A, int B) (int, int)
    void m(int X, double Y) (int, double)
    void m(double X, int Y) (double, int)

    In the case below, the calculate method is overloaded because the two methods have the same name but different type signatures (String) and (int).

    • calculate(String): void
    • calculate(int): void
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Overloading

    Method overloading is when there are multiple methods with the same name but different type signatures. Overloading is used to indicate that multiple operations do similar things but take different parameters.

    Type signature: The type signature of an operation is the type sequence of the parameters. The return type and parameter names are not part of the type signature. However, the parameter order is significant.

    Example:

    Method Type Signature
    int add(int X, int Y) (int, int)
    void add(int A, int B) (int, int)
    void m(int X, double Y) (int, double)
    void m(double X, int Y) (double, int)

    In the case below, the calculate method is overloaded because the two methods have the same name but different type signatures (String) and (int).

    • calculate(String): void
    • calculate(int): void
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/overloading/index.page-vue-render.js b/book/oop/inheritance/overloading/index.page-vue-render.js index f91dc5f5ca..5daf0244b8 100644 --- a/book/oop/inheritance/overloading/index.page-vue-render.js +++ b/book/oop/inheritance/overloading/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"overloading"}},[_c('span',[_v( with(this){return _c('p',[_c('strong',[_v("Method overloading is when there are multiple methods with the same name but different type signatures.")]),_v(" Overloading is used to indicate that multiple operations do similar things but take different parameters.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/overriding/index.html b/book/oop/inheritance/overriding/index.html index f3e91c7d4a..ab9b167801 100644 --- a/book/oop/inheritance/overriding/index.html +++ b/book/oop/inheritance/overriding/index.html @@ -13,7 +13,7 @@

    Can explain method overriding

    Paradigms → OOP → Inheritance → -

    Overriding

    Method overriding is when a subclass changes the behavior inherited from the parent class by re-implementing the method. Overridden methods have the same name, the same type signature, and the same (or a subtype of the) return type.

    Consider the following case of EvaluationReport class inheriting the Report class:

    Report methods EvaluationReport methods Overrides?
    print() print() Yes
    write(String) write(String) Yes
    read():String read(int):String No. Reason: the two methods have different signatures; This is a case of overloading (rather than overriding).

    Exercises


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Overriding

    Method overriding is when a subclass changes the behavior inherited from the parent class by re-implementing the method. Overridden methods have the same name, the same type signature, and the same (or a subtype of the) return type.

    Consider the following case of EvaluationReport class inheriting the Report class:

    Report methods EvaluationReport methods Overrides?
    print() print() Yes
    write(String) write(String) Yes
    read():String read(int):String No. Reason: the two methods have different signatures; This is a case of overloading (rather than overriding).

    Exercises


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/overriding/index.page-vue-render.js b/book/oop/inheritance/overriding/index.page-vue-render.js index ebda999772..4671759c99 100644 --- a/book/oop/inheritance/overriding/index.page-vue-render.js +++ b/book/oop/inheritance/overriding/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"overriding"}},[_c('span',[_v(" with(this){return _c('p',[_c('strong',[_v("Method "),_c('em',[_v("overriding")]),_v(" is when a subclass changes the behavior inherited from the parent class")]),_v(" by re-implementing the method. Overridden methods have the same name, the same type signature, and the same (or a subtype of the) return type.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/substitutability/index.html b/book/oop/inheritance/substitutability/index.html index bbdeaab27b..28870eadc7 100644 --- a/book/oop/inheritance/substitutability/index.html +++ b/book/oop/inheritance/substitutability/index.html @@ -87,7 +87,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/substitutability/index.page-vue-render.js b/book/oop/inheritance/substitutability/index.page-vue-render.js index e1dfb4fb91..0c977437ff 100644 --- a/book/oop/inheritance/substitutability/index.page-vue-render.js +++ b/book/oop/inheritance/substitutability/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"substitutability"}},[_c('span' with(this){return _c('p',[_c('strong',[_v("Every instance of a subclass is an instance of the superclass, but not vice-versa.")]),_v(" As a result, inheritance allows "),_c('em',[_v("substitutability")]),_v(": the ability to substitute a child class object where a parent class object is expected.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/inheritance/what/index.html b/book/oop/inheritance/what/index.html index 0205e5d405..9cefd91a55 100644 --- a/book/oop/inheritance/what/index.html +++ b/book/oop/inheritance/what/index.html @@ -13,7 +13,7 @@

    Can explain the meaning of inheritance

    Paradigms → OOP → Inheritance → -

    What

    The OOP concept Inheritance allows you to define a new class based on an existing class.

    For example, you can use inheritance to define an EvaluationReport class based on an existing Report class so that the EvaluationReport class does not have to duplicate data/behaviors that are already implemented in the Report class. The EvaluationReport can inherit the wordCount attribute and the print() method from the base class Report.

    • Other names for Base class: Parent class, Superclass
    • Other names for Derived class: Child class, Subclass, Extended class

    A superclass is said to be more general than the subclass. Conversely, a subclass is said to be more specialized than the superclass.

    Applying inheritance on a group of similar classes can result in the common parts among classes being extracted into more general classes.

    Man and Woman behave the same way for certain things. However, the two classes cannot be simply replaced with a more general class Person because of the need to distinguish between Man and Woman for certain other things. A solution is to add the Person class as a superclass (to contain the code common to men and women) and let Man and Woman inherit from Person class.

    Inheritance implies the derived class can be considered as a subtype of the base class (and the base class is a super-type of the derived class), resulting in an is a relationship.

    Inheritance does not necessarily mean a subtype relationship exists. However, the two often go hand-in-hand. For simplicity, at this point let us assume inheritance implies a subtype relationship.

    To continue the previous example,

    • Woman is a Person
    • Man is a Person

    Inheritance relationships through a chain of classes can result in inheritance hierarchies (aka inheritance trees).

    Two inheritance hierarchies/trees are given below. Note that the triangle points to the parent class. Observe how the Parrot is a Bird as well as it is an Animal.

    Multiple Inheritance is when a class inherits directly from multiple classes. Multiple inheritance among classes is allowed in some languages (e.g., Python, C++) but not in other languages (e.g., Java, C#).

    The Honey class inherits from the Food class and the Medicine class because honey can be consumed as a food as well as a medicine (in some oriental medicine practices). Similarly, a Car is a Vehicle, an Asset and a Liability.


    Exercises:

    Which statements are correct?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    The OOP concept Inheritance allows you to define a new class based on an existing class.

    For example, you can use inheritance to define an EvaluationReport class based on an existing Report class so that the EvaluationReport class does not have to duplicate data/behaviors that are already implemented in the Report class. The EvaluationReport can inherit the wordCount attribute and the print() method from the base class Report.

    • Other names for Base class: Parent class, Superclass
    • Other names for Derived class: Child class, Subclass, Extended class

    A superclass is said to be more general than the subclass. Conversely, a subclass is said to be more specialized than the superclass.

    Applying inheritance on a group of similar classes can result in the common parts among classes being extracted into more general classes.

    Man and Woman behave the same way for certain things. However, the two classes cannot be simply replaced with a more general class Person because of the need to distinguish between Man and Woman for certain other things. A solution is to add the Person class as a superclass (to contain the code common to men and women) and let Man and Woman inherit from Person class.

    Inheritance implies the derived class can be considered as a subtype of the base class (and the base class is a super-type of the derived class), resulting in an is a relationship.

    Inheritance does not necessarily mean a subtype relationship exists. However, the two often go hand-in-hand. For simplicity, at this point let us assume inheritance implies a subtype relationship.

    To continue the previous example,

    • Woman is a Person
    • Man is a Person

    Inheritance relationships through a chain of classes can result in inheritance hierarchies (aka inheritance trees).

    Two inheritance hierarchies/trees are given below. Note that the triangle points to the parent class. Observe how the Parrot is a Bird as well as it is an Animal.

    Multiple Inheritance is when a class inherits directly from multiple classes. Multiple inheritance among classes is allowed in some languages (e.g., Python, C++) but not in other languages (e.g., Java, C#).

    The Honey class inherits from the Food class and the Medicine class because honey can be consumed as a food as well as a medicine (in some oriental medicine practices). Similarly, a Car is a Vehicle, an Asset and a Liability.


    Exercises:

    Which statements are correct?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/inheritance/what/index.page-vue-render.js b/book/oop/inheritance/what/index.page-vue-render.js index 313a83cbd5..709037d93a 100644 --- a/book/oop/inheritance/what/index.page-vue-render.js +++ b/book/oop/inheritance/what/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Multiple Inheritance")]),_v( with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/introduction/index.html b/book/oop/introduction/index.html index ad92a9e8f2..b2ac74106a 100644 --- a/book/oop/introduction/index.html +++ b/book/oop/introduction/index.html @@ -13,7 +13,7 @@

    Paradigms → OOP → -

    Introduction

    What

    Can describe OOP at a higher level

    Object-Oriented Programming (OOP) is a programming paradigm. A programming paradigm guides programmers to analyze programming problems, and structure programming solutions, in a specific way.

    Programming languages have traditionally divided the world into two parts—data and operations on data. Data is static and immutable, except as the operations may change it. The procedures and functions that operate on data have no lasting state of their own; they’re useful only in their ability to affect data.

    This division is, of course, grounded in the way computers work, so it’s not one that you can easily ignore or push aside. Like the equally pervasive distinctions between matter and energy and between nouns and verbs, it forms the background against which you work. At some point, all programmers—even object-oriented programmers—must lay out the data structures that their programs will use and define the functions that will act on the data.

    With a procedural programming language like C, that’s about all there is to it. The language may offer various kinds of support for organizing data and functions, but it won’t divide the world any differently. Functions and data structures are the basic elements of design.

    Object-oriented programming doesn’t so much dispute this view of the world as restructure it at a higher level. It groups operations and data into modular units called objects and lets you combine objects into structured networks to form a complete program. In an object-oriented programming language, objects and object interactions are the basic elements of design.

    -- Object-Oriented Programming with Objective-C, Apple

    Some other examples of programming paradigms are:

    Paradigm Programming Languages
    Procedural Programming paradigm C
    Functional Programming paradigm F#, Haskell, Scala
    Logic Programming paradigm Prolog

    Some programming languages support multiple paradigms.

    Java is primarily an OOP language but it supports limited forms of functional programming and it can be used to (although not recommended to) write procedural code. e.g. se-edu/addressbook-level1

    JavaScript and Python support functional, procedural, and OOP programming.


    Exercises:

    Statements about OOP


    Procedural vs OOP



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can describe OOP at a higher level

    Object-Oriented Programming (OOP) is a programming paradigm. A programming paradigm guides programmers to analyze programming problems, and structure programming solutions, in a specific way.

    Programming languages have traditionally divided the world into two parts—data and operations on data. Data is static and immutable, except as the operations may change it. The procedures and functions that operate on data have no lasting state of their own; they’re useful only in their ability to affect data.

    This division is, of course, grounded in the way computers work, so it’s not one that you can easily ignore or push aside. Like the equally pervasive distinctions between matter and energy and between nouns and verbs, it forms the background against which you work. At some point, all programmers—even object-oriented programmers—must lay out the data structures that their programs will use and define the functions that will act on the data.

    With a procedural programming language like C, that’s about all there is to it. The language may offer various kinds of support for organizing data and functions, but it won’t divide the world any differently. Functions and data structures are the basic elements of design.

    Object-oriented programming doesn’t so much dispute this view of the world as restructure it at a higher level. It groups operations and data into modular units called objects and lets you combine objects into structured networks to form a complete program. In an object-oriented programming language, objects and object interactions are the basic elements of design.

    -- Object-Oriented Programming with Objective-C, Apple

    Some other examples of programming paradigms are:

    Paradigm Programming Languages
    Procedural Programming paradigm C
    Functional Programming paradigm F#, Haskell, Scala
    Logic Programming paradigm Prolog

    Some programming languages support multiple paradigms.

    Java is primarily an OOP language but it supports limited forms of functional programming and it can be used to (although not recommended to) write procedural code. e.g. se-edu/addressbook-level1

    JavaScript and Python support functional, procedural, and OOP programming.


    Exercises:

    Statements about OOP


    Procedural vs OOP



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/introduction/index.page-vue-render.js b/book/oop/introduction/index.page-vue-render.js index 97cfc517f2..6eb65d1fd5 100644 --- a/book/oop/introduction/index.page-vue-render.js +++ b/book/oop/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/introduction/what/index.html b/book/oop/introduction/what/index.html index 0bc271f3f0..b99220b73b 100644 --- a/book/oop/introduction/what/index.html +++ b/book/oop/introduction/what/index.html @@ -13,7 +13,7 @@

    Can describe OOP at a higher level

    Paradigms → OOP → Introduction → -

    What

    Object-Oriented Programming (OOP) is a programming paradigm. A programming paradigm guides programmers to analyze programming problems, and structure programming solutions, in a specific way.

    Programming languages have traditionally divided the world into two parts—data and operations on data. Data is static and immutable, except as the operations may change it. The procedures and functions that operate on data have no lasting state of their own; they’re useful only in their ability to affect data.

    This division is, of course, grounded in the way computers work, so it’s not one that you can easily ignore or push aside. Like the equally pervasive distinctions between matter and energy and between nouns and verbs, it forms the background against which you work. At some point, all programmers—even object-oriented programmers—must lay out the data structures that their programs will use and define the functions that will act on the data.

    With a procedural programming language like C, that’s about all there is to it. The language may offer various kinds of support for organizing data and functions, but it won’t divide the world any differently. Functions and data structures are the basic elements of design.

    Object-oriented programming doesn’t so much dispute this view of the world as restructure it at a higher level. It groups operations and data into modular units called objects and lets you combine objects into structured networks to form a complete program. In an object-oriented programming language, objects and object interactions are the basic elements of design.

    -- Object-Oriented Programming with Objective-C, Apple

    Some other examples of programming paradigms are:

    Paradigm Programming Languages
    Procedural Programming paradigm C
    Functional Programming paradigm F#, Haskell, Scala
    Logic Programming paradigm Prolog

    Some programming languages support multiple paradigms.

    Java is primarily an OOP language but it supports limited forms of functional programming and it can be used to (although not recommended to) write procedural code. e.g. se-edu/addressbook-level1

    JavaScript and Python support functional, procedural, and OOP programming.


    Exercises:

    Statements about OOP


    Procedural vs OOP


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Object-Oriented Programming (OOP) is a programming paradigm. A programming paradigm guides programmers to analyze programming problems, and structure programming solutions, in a specific way.

    Programming languages have traditionally divided the world into two parts—data and operations on data. Data is static and immutable, except as the operations may change it. The procedures and functions that operate on data have no lasting state of their own; they’re useful only in their ability to affect data.

    This division is, of course, grounded in the way computers work, so it’s not one that you can easily ignore or push aside. Like the equally pervasive distinctions between matter and energy and between nouns and verbs, it forms the background against which you work. At some point, all programmers—even object-oriented programmers—must lay out the data structures that their programs will use and define the functions that will act on the data.

    With a procedural programming language like C, that’s about all there is to it. The language may offer various kinds of support for organizing data and functions, but it won’t divide the world any differently. Functions and data structures are the basic elements of design.

    Object-oriented programming doesn’t so much dispute this view of the world as restructure it at a higher level. It groups operations and data into modular units called objects and lets you combine objects into structured networks to form a complete program. In an object-oriented programming language, objects and object interactions are the basic elements of design.

    -- Object-Oriented Programming with Objective-C, Apple

    Some other examples of programming paradigms are:

    Paradigm Programming Languages
    Procedural Programming paradigm C
    Functional Programming paradigm F#, Haskell, Scala
    Logic Programming paradigm Prolog

    Some programming languages support multiple paradigms.

    Java is primarily an OOP language but it supports limited forms of functional programming and it can be used to (although not recommended to) write procedural code. e.g. se-edu/addressbook-level1

    JavaScript and Python support functional, procedural, and OOP programming.


    Exercises:

    Statements about OOP


    Procedural vs OOP


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/introduction/what/index.page-vue-render.js b/book/oop/introduction/what/index.page-vue-render.js index 6aa29e1ae7..d5f577f6db 100644 --- a/book/oop/introduction/what/index.page-vue-render.js +++ b/book/oop/introduction/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Some programming languages support mu with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/more/index.html b/book/oop/more/index.html index 9bf373990e..9b94872f50 100644 --- a/book/oop/more/index.html +++ b/book/oop/more/index.html @@ -13,7 +13,7 @@

    Paradigms → OOP → -

    More

    Miscellaneous

    Can answer frequently asked OOP questions

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.


    Review

    Can combine some OOP concepts

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    More

    Miscellaneous

    Can answer frequently asked OOP questions

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.


    Review

    Can combine some OOP concepts

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/more/index.page-vue-render.js b/book/oop/more/index.page-vue-render.js index 147f3a8d19..7604779ffb 100644 --- a/book/oop/more/index.page-vue-render.js +++ b/book/oop/more/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"more"}},[_c('span',[_v("More")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/more/miscellaneous/index.html b/book/oop/more/miscellaneous/index.html index 380c720201..b65a3168a3 100644 --- a/book/oop/more/miscellaneous/index.html +++ b/book/oop/more/miscellaneous/index.html @@ -13,7 +13,7 @@

    Can answer frequently asked OOP questions

    Paradigms → OOP → More → -

    Miscellaneous

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Miscellaneous

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/more/miscellaneous/index.page-vue-render.js b/book/oop/more/miscellaneous/index.page-vue-render.js index 0ee53444e7..a74b71fbe5 100644 --- a/book/oop/more/miscellaneous/index.page-vue-render.js +++ b/book/oop/more/miscellaneous/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can answer frequently asked OOP questions")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Paradigms → OOP → More →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"miscellaneous"}},[_c('span',[_v("Miscellaneous")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#miscellaneous","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("What is the difference between a Class, an Abstract Class, and an Interface?")])]),_v(" "),_c('ul',[_c('li',[_v("An interface is a behavior specification with no implementation.")]),_v(" "),_c('li',[_v("A class is a behavior specification + implementation.")]),_v(" "),_c('li',[_v("An abstract class is a behavior specification + a possibly incomplete implementation.")])]),_v(" "),_c('p',[_c('strong',[_v("How does "),_c('em',[_v("overriding")]),_v(" differ from "),_c('em',[_v("overloading")]),_v("?")])]),_v(" "),_c('p',[_v("Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.")]),_v(" "),_c('p',[_v("Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/more/review/index.html b/book/oop/more/review/index.html index 510ec7cfea..b5638767b1 100644 --- a/book/oop/more/review/index.html +++ b/book/oop/more/review/index.html @@ -13,7 +13,7 @@ +

    Review

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/more/review/index.page-vue-render.js b/book/oop/more/review/index.page-vue-render.js index c325102043..172dac9b63 100644 --- a/book/oop/more/review/index.page-vue-render.js +++ b/book/oop/more/review/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("...")])])} with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/objects/abstraction/index.html b/book/oop/objects/abstraction/index.html index ce80eca677..a5b25fd978 100644 --- a/book/oop/objects/abstraction/index.html +++ b/book/oop/objects/abstraction/index.html @@ -13,7 +13,7 @@

    Can explain the abstraction aspect of OOP

    Paradigms → OOP → Objects → -

    Objects as abstractions

    The concept of Objects in OOP is an abstraction mechanism because it allows us to abstract away the lower level details and work with bigger granularity entities i.e. ignore details of data formats and the method implementation details and work at the level of objects.

    You can deal with a Person object that represents the person Adam and query the object for Adam's age instead of dealing with details such as Adam’s date of birth (DoB), in what format the DoB is stored, the algorithm used to calculate the age from the DoB, etc.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Objects as abstractions

    The concept of Objects in OOP is an abstraction mechanism because it allows us to abstract away the lower level details and work with bigger granularity entities i.e. ignore details of data formats and the method implementation details and work at the level of objects.

    You can deal with a Person object that represents the person Adam and query the object for Adam's age instead of dealing with details such as Adam’s date of birth (DoB), in what format the DoB is stored, the algorithm used to calculate the age from the DoB, etc.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/objects/abstraction/index.page-vue-render.js b/book/oop/objects/abstraction/index.page-vue-render.js index 9a3ce13fdf..2207e6eac2 100644 --- a/book/oop/objects/abstraction/index.page-vue-render.js +++ b/book/oop/objects/abstraction/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"objects-as-abstractions"}},[_c('span',[_v("Objects as abstractions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#objects-as-abstractions","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/objects/encapsulation/index.html b/book/oop/objects/encapsulation/index.html index 6739f99f7b..03a12d0437 100644 --- a/book/oop/objects/encapsulation/index.html +++ b/book/oop/objects/encapsulation/index.html @@ -13,7 +13,7 @@

    Can explain the encapsulation aspect of OOP

    Paradigms → OOP → Objects → -

    Encapsulation of objects

    Encapsulation protects an implementation from unintended actions and from inadvertent access.
    -- Object-Oriented Programming with Objective-C, Apple

    An object is an encapsulation of some data and related behavior in terms of two aspects:

    1. The packaging aspect: An object packages data and related behavior together into one self-contained unit.

    2. The information hiding aspect: The data in an object is hidden from the outside world and are only accessible using the object's interface.


    Exercises:

    Choose the correct statement


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Encapsulation of objects

    Encapsulation protects an implementation from unintended actions and from inadvertent access.
    -- Object-Oriented Programming with Objective-C, Apple

    An object is an encapsulation of some data and related behavior in terms of two aspects:

    1. The packaging aspect: An object packages data and related behavior together into one self-contained unit.

    2. The information hiding aspect: The data in an object is hidden from the outside world and are only accessible using the object's interface.


    Exercises:

    Choose the correct statement


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/objects/encapsulation/index.page-vue-render.js b/book/oop/objects/encapsulation/index.page-vue-render.js index d1cd64a8df..dfad65d935 100644 --- a/book/oop/objects/encapsulation/index.page-vue-render.js +++ b/book/oop/objects/encapsulation/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('blockquote',[_c('p',[_v("Encapsulation protects with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/objects/index.html b/book/oop/objects/index.html index 685d988e83..127e08e999 100644 --- a/book/oop/objects/index.html +++ b/book/oop/objects/index.html @@ -20,7 +20,7 @@ how warm its contents are) with behavior (the ability to dispense its contents at various flow rates, to be opened or closed, to withstand high or low temperatures).

    It’s this resemblance to real things that gives objects much of their power and appeal. They can not only model components of real systems, but equally as well fulfill assigned roles as components in software systems.

    -- Object-Oriented Programming with Objective-C, Apple

    OOP views the world as a network of interacting objects.

    A real world scenario viewed as a network of interacting objects:

    You are asked to find out the average age of a group of people Adam, Beth, Charlie, and Daisy. You take a piece of paper and pen, go to each person, ask for their age, and note it down. After collecting the age of all four, you enter it into a calculator to find the total. And then, use the same calculator to divide the total by four, to get the average age. This can be viewed as the objects You, Pen, Paper, Calculator, Adam, Beth, Charlie, and Daisy interacting to accomplish the end result of calculating the average age of the four persons. These objects can be considered as connected in a certain network of certain structure that dictates how these objects can interact. For example, You object is connected to the Pen object, and hence You can use the Pen object to write.

    OOP solutions try to create a similar object network inside the computer’s memory – a sort of virtual simulation of the corresponding real world scenario – so that a similar result can be achieved programmatically.

    OOP does not demand that the virtual world object network follow the real world exactly.

    Our previous example can be tweaked a bit as follows:

    • Use an object called Main to represent your role in the scenario.
    • As there is no physical writing involved, you can replace the Pen and Paper with an object called AgeList that is able to keep a list of ages.

    Every object has both state (data) and behavior (operations on data).

    The state and behavior of our running example are as follows:

    Object Real World? Virtual World? Example of State (i.e. Data) Examples of Behavior (i.e. Operations)
    Adam Name, Date of Birth Calculate age based on birthday
    Pen - Ink color, Amount of ink remaining Write
    AgeList - Recorded ages Give the number of entries, Accept an entry to record
    Calculator Numbers already entered Calculate the sum, divide
    You/Main Average age, Sum of ages Use other objects to calculate

    Every object has an interface and an implementation.

    Every real world object has,

    • an interface through which other objects can interact with it, and,
    • an implementation that supports the interface but may not be accessible to the other object.

    The interface and implementation of some real-world objects in our example:

    • Calculator: the buttons and the display are part of the interface; circuits are part of the implementation.
    • Adam: In the context of our 'calculate average age' example, -
      • the interface of Adam consists of requests that Adam will respond to, e.g. "Give age to the nearest year, as at Jan 1st of this year" "State your name".
      • the implementation includes the mental calculation Adam uses to calculate the age which is not visible to other objects.

    Similarly, every object in the virtual world has an interface and an implementation.

    The interface and implementation of some virtual-world objects in our example:

    • Adam: the interface might have a method getAge(Date asAt); the implementation of that method is not visible to other objects.

    Objects interact by sending messages. Both real world and virtual world object interactions can be viewed as objects sending messages to each other. The message can result in the sender object receiving a response and/or the receiver object’s state being changed. Furthermore, the result can vary based on which object received the message, even if the message is identical (see rows 1 and 2 in the example below).

    Same messages and responses from our running example:

    World Sender Receiver Message Response State Change
    Real You Adam "What is your name?" "Adam" -
    Real as above Beth as above "Beth" -
    Real You Pen Put nib on paper and apply pressure Makes a mark on your paper Ink level goes down
    Virtual Main Calculator (current total is 50) add(int i): int i = 23 73 total = total + 23

    Exercises:

    Describe objects in the given scenario



    Objects as abstractions

    Can explain the abstraction aspect of OOP

    The concept of Objects in OOP is an abstraction mechanism because it allows us to abstract away the lower level details and work with bigger granularity entities i.e. ignore details of data formats and the method implementation details and work at the level of objects.

    You can deal with a Person object that represents the person Adam and query the object for Adam's age instead of dealing with details such as Adam’s date of birth (DoB), in what format the DoB is stored, the algorithm used to calculate the age from the DoB, etc.


    Encapsulation of objects

    Can explain the encapsulation aspect of OOP

    Encapsulation protects an implementation from unintended actions and from inadvertent access.
    -- Object-Oriented Programming with Objective-C, Apple

    An object is an encapsulation of some data and related behavior in terms of two aspects:

    1. The packaging aspect: An object packages data and related behavior together into one self-contained unit.

    2. The information hiding aspect: The data in an object is hidden from the outside world and are only accessible using the object's interface.


    Exercises:

    Choose the correct statement



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • the interface of Adam consists of requests that Adam will respond to, e.g. "Give age to the nearest year, as at Jan 1st of this year" "State your name".
    • the implementation includes the mental calculation Adam uses to calculate the age which is not visible to other objects.

    Similarly, every object in the virtual world has an interface and an implementation.

    The interface and implementation of some virtual-world objects in our example:

    • Adam: the interface might have a method getAge(Date asAt); the implementation of that method is not visible to other objects.

    Objects interact by sending messages. Both real world and virtual world object interactions can be viewed as objects sending messages to each other. The message can result in the sender object receiving a response and/or the receiver object’s state being changed. Furthermore, the result can vary based on which object received the message, even if the message is identical (see rows 1 and 2 in the example below).

    Same messages and responses from our running example:

    World Sender Receiver Message Response State Change
    Real You Adam "What is your name?" "Adam" -
    Real as above Beth as above "Beth" -
    Real You Pen Put nib on paper and apply pressure Makes a mark on your paper Ink level goes down
    Virtual Main Calculator (current total is 50) add(int i): int i = 23 73 total = total + 23

    Exercises:

    Describe objects in the given scenario



    Objects as abstractions

    Can explain the abstraction aspect of OOP

    The concept of Objects in OOP is an abstraction mechanism because it allows us to abstract away the lower level details and work with bigger granularity entities i.e. ignore details of data formats and the method implementation details and work at the level of objects.

    You can deal with a Person object that represents the person Adam and query the object for Adam's age instead of dealing with details such as Adam’s date of birth (DoB), in what format the DoB is stored, the algorithm used to calculate the age from the DoB, etc.


    Encapsulation of objects

    Can explain the encapsulation aspect of OOP

    Encapsulation protects an implementation from unintended actions and from inadvertent access.
    -- Object-Oriented Programming with Objective-C, Apple

    An object is an encapsulation of some data and related behavior in terms of two aspects:

    1. The packaging aspect: An object packages data and related behavior together into one self-contained unit.

    2. The information hiding aspect: The data in an object is hidden from the outside world and are only accessible using the object's interface.


    Exercises:

    Choose the correct statement



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/objects/index.page-vue-render.js b/book/oop/objects/index.page-vue-render.js index 55885ae0ab..e6037a5de0 100644 --- a/book/oop/objects/index.page-vue-render.js +++ b/book/oop/objects/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"objects"}},[_c('span',[_v("Objects")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#objects","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/objects/what/index.html b/book/oop/objects/what/index.html index 531951944f..0e48742064 100644 --- a/book/oop/objects/what/index.html +++ b/book/oop/objects/what/index.html @@ -20,7 +20,7 @@ how warm its contents are) with behavior (the ability to dispense its contents at various flow rates, to be opened or closed, to withstand high or low temperatures).

    It’s this resemblance to real things that gives objects much of their power and appeal. They can not only model components of real systems, but equally as well fulfill assigned roles as components in software systems.

    -- Object-Oriented Programming with Objective-C, Apple

    OOP views the world as a network of interacting objects.

    A real world scenario viewed as a network of interacting objects:

    You are asked to find out the average age of a group of people Adam, Beth, Charlie, and Daisy. You take a piece of paper and pen, go to each person, ask for their age, and note it down. After collecting the age of all four, you enter it into a calculator to find the total. And then, use the same calculator to divide the total by four, to get the average age. This can be viewed as the objects You, Pen, Paper, Calculator, Adam, Beth, Charlie, and Daisy interacting to accomplish the end result of calculating the average age of the four persons. These objects can be considered as connected in a certain network of certain structure that dictates how these objects can interact. For example, You object is connected to the Pen object, and hence You can use the Pen object to write.

    OOP solutions try to create a similar object network inside the computer’s memory – a sort of virtual simulation of the corresponding real world scenario – so that a similar result can be achieved programmatically.

    OOP does not demand that the virtual world object network follow the real world exactly.

    Our previous example can be tweaked a bit as follows:

    • Use an object called Main to represent your role in the scenario.
    • As there is no physical writing involved, you can replace the Pen and Paper with an object called AgeList that is able to keep a list of ages.

    Every object has both state (data) and behavior (operations on data).

    The state and behavior of our running example are as follows:

    Object Real World? Virtual World? Example of State (i.e. Data) Examples of Behavior (i.e. Operations)
    Adam Name, Date of Birth Calculate age based on birthday
    Pen - Ink color, Amount of ink remaining Write
    AgeList - Recorded ages Give the number of entries, Accept an entry to record
    Calculator Numbers already entered Calculate the sum, divide
    You/Main Average age, Sum of ages Use other objects to calculate

    Every object has an interface and an implementation.

    Every real world object has,

    • an interface through which other objects can interact with it, and,
    • an implementation that supports the interface but may not be accessible to the other object.

    The interface and implementation of some real-world objects in our example:

    • Calculator: the buttons and the display are part of the interface; circuits are part of the implementation.
    • Adam: In the context of our 'calculate average age' example, -
      • the interface of Adam consists of requests that Adam will respond to, e.g. "Give age to the nearest year, as at Jan 1st of this year" "State your name".
      • the implementation includes the mental calculation Adam uses to calculate the age which is not visible to other objects.

    Similarly, every object in the virtual world has an interface and an implementation.

    The interface and implementation of some virtual-world objects in our example:

    • Adam: the interface might have a method getAge(Date asAt); the implementation of that method is not visible to other objects.

    Objects interact by sending messages. Both real world and virtual world object interactions can be viewed as objects sending messages to each other. The message can result in the sender object receiving a response and/or the receiver object’s state being changed. Furthermore, the result can vary based on which object received the message, even if the message is identical (see rows 1 and 2 in the example below).

    Same messages and responses from our running example:

    World Sender Receiver Message Response State Change
    Real You Adam "What is your name?" "Adam" -
    Real as above Beth as above "Beth" -
    Real You Pen Put nib on paper and apply pressure Makes a mark on your paper Ink level goes down
    Virtual Main Calculator (current total is 50) add(int i): int i = 23 73 total = total + 23

    Exercises:

    Describe objects in the given scenario


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • the interface of Adam consists of requests that Adam will respond to, e.g. "Give age to the nearest year, as at Jan 1st of this year" "State your name".
    • the implementation includes the mental calculation Adam uses to calculate the age which is not visible to other objects.

    Similarly, every object in the virtual world has an interface and an implementation.

    The interface and implementation of some virtual-world objects in our example:

    • Adam: the interface might have a method getAge(Date asAt); the implementation of that method is not visible to other objects.

    Objects interact by sending messages. Both real world and virtual world object interactions can be viewed as objects sending messages to each other. The message can result in the sender object receiving a response and/or the receiver object’s state being changed. Furthermore, the result can vary based on which object received the message, even if the message is identical (see rows 1 and 2 in the example below).

    Same messages and responses from our running example:

    World Sender Receiver Message Response State Change
    Real You Adam "What is your name?" "Adam" -
    Real as above Beth as above "Beth" -
    Real You Pen Put nib on paper and apply pressure Makes a mark on your paper Ink level goes down
    Virtual Main Calculator (current total is 50) add(int i): int i = 23 73 total = total + 23

    Exercises:

    Describe objects in the given scenario


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/objects/what/index.page-vue-render.js b/book/oop/objects/what/index.page-vue-render.js index a5804e9eb3..3b88be0b43 100644 --- a/book/oop/objects/what/index.page-vue-render.js +++ b/book/oop/objects/what/index.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('p',[_c('strong',[_v("Objects interact by sending messages. with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/polymorphism/how/index.html b/book/oop/polymorphism/how/index.html index 55fb1491fb..d673701f4f 100644 --- a/book/oop/polymorphism/how/index.html +++ b/book/oop/polymorphism/how/index.html @@ -13,7 +13,7 @@

    Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Paradigms → OOP → Polymorphism → -

    How

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/polymorphism/how/index.page-vue-render.js b/book/oop/polymorphism/how/index.page-vue-render.js index a58485d3fc..7cb6aa72c6 100644 --- a/book/oop/polymorphism/how/index.page-vue-render.js +++ b/book/oop/polymorphism/how/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_v("Three concepts combine to a with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/polymorphism/index.html b/book/oop/polymorphism/index.html index 5ec7bda639..8c1e459ef9 100644 --- a/book/oop/polymorphism/index.html +++ b/book/oop/polymorphism/index.html @@ -13,7 +13,7 @@

    Paradigms → OOP → -

    Polymorphism

    What

    Can explain OOP polymorphism

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".


    How

    Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Polymorphism

    What

    Can explain OOP polymorphism

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".


    How

    Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/polymorphism/index.page-vue-render.js b/book/oop/polymorphism/index.page-vue-render.js index fe6e75e1f3..a2cb920860 100644 --- a/book/oop/polymorphism/index.page-vue-render.js +++ b/book/oop/polymorphism/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"polymorphism"}},[_c('span',[_v("Polymorphism")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#polymorphism","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/oop/polymorphism/what/index.html b/book/oop/polymorphism/what/index.html index 7570049b91..b22947c91e 100644 --- a/book/oop/polymorphism/what/index.html +++ b/book/oop/polymorphism/what/index.html @@ -13,7 +13,7 @@

    Can explain OOP polymorphism

    Paradigms → OOP → Polymorphism → -

    What

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/oop/polymorphism/what/index.page-vue-render.js b/book/oop/polymorphism/what/index.page-vue-render.js index b227591e3d..93abb862e4 100644 --- a/book/oop/polymorphism/what/index.page-vue-render.js +++ b/book/oop/polymorphism/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Polymorphism")]),_v(" allows with(this){return _c('p',[_c('em',[_v("Polymorphism")]),_v(" literally means \"ability to take many forms\".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/brooksLaw/index.html b/book/principles/brooksLaw/index.html index b108139055..49edc6c8c3 100644 --- a/book/principles/brooksLaw/index.html +++ b/book/principles/brooksLaw/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/book/principles/brooksLaw/index.page-vue-render.js b/book/principles/brooksLaw/index.page-vue-render.js index 1ed2dde106..f5668f4be0 100644 --- a/book/principles/brooksLaw/index.page-vue-render.js +++ b/book/principles/brooksLaw/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"brooks-law"}},[_c('span',[_v(" with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/dependencyInversionPrinciple/index.html b/book/principles/dependencyInversionPrinciple/index.html index f5e1074852..42c098698c 100644 --- a/book/principles/dependencyInversionPrinciple/index.html +++ b/book/principles/dependencyInversionPrinciple/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Can explain dependency inversion principle (DIP)

    Principles →

    Dependency inversion principle

    Dependency inversion principle (DIP):

    1. High-level modules should not depend on low-level modules. Both should depend on abstractions.
    2. Abstractions should not depend on details. Details should depend on abstractions.

    Example:

    In design (a), the higher level class Payroll depends on the lower level class Employee, which is a violation of DIP. In design (b), both Payroll and Employee depend on the Payee interface (note that inheritance is a dependency).

    Design (b) is more flexible (and less coupled) because now the Payroll class need not change when the Employee class changes.


    Exercises:

    Which of these statements is true about the Dependency Inversion Principle?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Can explain dependency inversion principle (DIP)

    Principles →

    Dependency inversion principle

    Dependency inversion principle (DIP):

    1. High-level modules should not depend on low-level modules. Both should depend on abstractions.
    2. Abstractions should not depend on details. Details should depend on abstractions.

    Example:

    In design (a), the higher level class Payroll depends on the lower level class Employee, which is a violation of DIP. In design (b), both Payroll and Employee depend on the Payee interface (note that inheritance is a dependency).

    Design (b) is more flexible (and less coupled) because now the Payroll class need not change when the Employee class changes.


    Exercises:

    Which of these statements is true about the Dependency Inversion Principle?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/dependencyInversionPrinciple/index.page-vue-render.js b/book/principles/dependencyInversionPrinciple/index.page-vue-render.js index 6c45d1db22..65eb91c525 100644 --- a/book/principles/dependencyInversionPrinciple/index.page-vue-render.js +++ b/book/principles/dependencyInversionPrinciple/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"dependency-inversion-principle with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/dryPrinciple/index.html b/book/principles/dryPrinciple/index.html index ba0bec7fef..e1864a8a4c 100644 --- a/book/principles/dryPrinciple/index.html +++ b/book/principles/dryPrinciple/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Can explain DRY principle

    Principles →

    DRY principle

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    This principle guards against the duplication of information.

    A functionality being implemented twice is a violation of the DRY principle even if the two implementations are different.

    The value of a system-wide timeout being defined in multiple places is a violation of DRY.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Can explain DRY principle

    Principles →

    DRY principle

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    This principle guards against the duplication of information.

    A functionality being implemented twice is a violation of the DRY principle even if the two implementations are different.

    The value of a system-wide timeout being defined in multiple places is a violation of DRY.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/dryPrinciple/index.page-vue-render.js b/book/principles/dryPrinciple/index.page-vue-render.js index ead5e7867a..e1b2bda2b2 100644 --- a/book/principles/dryPrinciple/index.page-vue-render.js +++ b/book/principles/dryPrinciple/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"dry-principle"}},[_c('span',[_v("DRY principle")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dry-principle","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/index.html b/book/principles/index.html index 3d7c2abf4f..d2b65df321 100644 --- a/book/principles/index.html +++ b/book/principles/index.html @@ -172,7 +172,7 @@ -

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.


    Exercises:

    Examples for LoD


    LoD violation?


    Odd one out



    YAGNI principle

    Can explain YAGNI principle

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    The principle says that some capability you presume your software needs in the future should not be built now because chances are "you aren't gonna need it". The rationale is that you do not have perfect information about the future and therefore some of the extra work you do to fulfill a potential future need might go to waste when some of your predictions fail to materialize.


    Resources:
    • Yagni -- A detailed article explaining YAGNI, written by Martin Fowler.

    DRY principle

    Can explain DRY principle

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    This principle guards against the duplication of information.

    A functionality being implemented twice is a violation of the DRY principle even if the two implementations are different.

    The value of a system-wide timeout being defined in multiple places is a violation of DRY.


    Brooks' law

    Can explain Brooks' law

    Brooks' law: Adding people to a late project will make it later. -- Fred Brooks (author of The Mythical Man-Month)

    Explanation: The additional communication overhead will outweigh the benefit of adding extra manpower, especially if done near a deadline.


    Exercises:

    Brook’s Law vs school project


    Which one is related to Brook's law?



    Review

    Can combine some concepts of principles


    Exercises:

    Pick the odd one out



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.


    Exercises:

    Examples for LoD


    LoD violation?


    Odd one out



    YAGNI principle

    Can explain YAGNI principle

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    The principle says that some capability you presume your software needs in the future should not be built now because chances are "you aren't gonna need it". The rationale is that you do not have perfect information about the future and therefore some of the extra work you do to fulfill a potential future need might go to waste when some of your predictions fail to materialize.


    Resources:
    • Yagni -- A detailed article explaining YAGNI, written by Martin Fowler.

    DRY principle

    Can explain DRY principle

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    This principle guards against the duplication of information.

    A functionality being implemented twice is a violation of the DRY principle even if the two implementations are different.

    The value of a system-wide timeout being defined in multiple places is a violation of DRY.


    Brooks' law

    Can explain Brooks' law

    Brooks' law: Adding people to a late project will make it later. -- Fred Brooks (author of The Mythical Man-Month)

    Explanation: The additional communication overhead will outweigh the benefit of adding extra manpower, especially if done near a deadline.


    Exercises:

    Brook’s Law vs school project


    Which one is related to Brook's law?



    Review

    Can combine some concepts of principles


    Exercises:

    Pick the odd one out



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/index.page-vue-render.js b/book/principles/index.page-vue-render.js index ad42396ee7..bda3eeeb9f 100644 --- a/book/principles/index.page-vue-render.js +++ b/book/principles/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"principles"}},[_c('span',[_v("Principles")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#principles","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/interfaceSegregationPrinciple/index.html b/book/principles/interfaceSegregationPrinciple/index.html index c7f2178686..58fe1c1695 100644 --- a/book/principles/interfaceSegregationPrinciple/index.html +++ b/book/principles/interfaceSegregationPrinciple/index.html @@ -95,7 +95,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/interfaceSegregationPrinciple/index.page-vue-render.js b/book/principles/interfaceSegregationPrinciple/index.page-vue-render.js index 248d1c5643..f6cd0c3ff5 100644 --- a/book/principles/interfaceSegregationPrinciple/index.page-vue-render.js +++ b/book/principles/interfaceSegregationPrinciple/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"interface-segregation-principle"}},[_c('span',[_v("Interface segregation principle")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#interface-segregation-principle","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/lawOfDemeter/index.html b/book/principles/lawOfDemeter/index.html index b4df544826..ff687de56c 100644 --- a/book/principles/lawOfDemeter/index.html +++ b/book/principles/lawOfDemeter/index.html @@ -51,7 +51,7 @@ -

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.


    Exercises:

    Examples for LoD


    LoD violation?


    Odd one out


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.


    Exercises:

    Examples for LoD


    LoD violation?


    Odd one out


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/lawOfDemeter/index.page-vue-render.js b/book/principles/lawOfDemeter/index.page-vue-render.js index 25d9bdf3e8..f794420231 100644 --- a/book/principles/lawOfDemeter/index.page-vue-render.js +++ b/book/principles/lawOfDemeter/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("LoD aims to prevent objects from navi with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/liskovSubstitutionPrinciple/index.html b/book/principles/liskovSubstitutionPrinciple/index.html index 41e7cf62f0..8dfb1582ea 100644 --- a/book/principles/liskovSubstitutionPrinciple/index.html +++ b/book/principles/liskovSubstitutionPrinciple/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Can explain Liskov Substitution Principle

    Principles →

    Liskov substitution principle

    Liskov substitution principle (LSP): Derived classes must be substitutable for their base classes. -- proposed by Barbara Liskov

    LSP sounds the same as substitutability but it goes beyond substitutability; LSP implies that a subclass should not be more restrictive than the behavior specified by the superclass. As you know, Java has language support for substitutability. However, if LSP is not followed, substituting a subclass object for a superclass object can break the functionality of the code.

    Suppose the Payroll class depends on the adjustMySalary(int percent) method of the Staff class. Furthermore, the Staff class states that the adjustMySalary method will work for all positive percent values. Both the Admin and Academic classes override the adjustMySalary method.

    Now consider the following:

    • The Admin#adjustMySalary method works for both negative and positive percent values.
    • The Academic#adjustMySalary method works for percent values 1..100 only.

    In the above scenario,

    • The Admin class follows LSP because it fulfills Payroll’s expectation of Staff objects (i.e. it works for all positive values). Substituting Admin objects for Staff objects will not break the Payroll class functionality.
    • The Academic class violates LSP because it will not work for percent values over 100 as expected by the Payroll class. Substituting Academic objects for Staff objects can potentially break the Payroll class functionality.

    Another example



    Exercises:

    Is this LSP?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Can explain Liskov Substitution Principle

    Principles →

    Liskov substitution principle

    Liskov substitution principle (LSP): Derived classes must be substitutable for their base classes. -- proposed by Barbara Liskov

    LSP sounds the same as substitutability but it goes beyond substitutability; LSP implies that a subclass should not be more restrictive than the behavior specified by the superclass. As you know, Java has language support for substitutability. However, if LSP is not followed, substituting a subclass object for a superclass object can break the functionality of the code.

    Suppose the Payroll class depends on the adjustMySalary(int percent) method of the Staff class. Furthermore, the Staff class states that the adjustMySalary method will work for all positive percent values. Both the Admin and Academic classes override the adjustMySalary method.

    Now consider the following:

    • The Admin#adjustMySalary method works for both negative and positive percent values.
    • The Academic#adjustMySalary method works for percent values 1..100 only.

    In the above scenario,

    • The Admin class follows LSP because it fulfills Payroll’s expectation of Staff objects (i.e. it works for all positive values). Substituting Admin objects for Staff objects will not break the Payroll class functionality.
    • The Academic class violates LSP because it will not work for percent values over 100 as expected by the Payroll class. Substituting Academic objects for Staff objects can potentially break the Payroll class functionality.

    Another example



    Exercises:

    Is this LSP?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/liskovSubstitutionPrinciple/index.page-vue-render.js b/book/principles/liskovSubstitutionPrinciple/index.page-vue-render.js index 26bbac0b99..ad812d60b1 100644 --- a/book/principles/liskovSubstitutionPrinciple/index.page-vue-render.js +++ b/book/principles/liskovSubstitutionPrinciple/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"liskov-substitution-principle" with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/openClosedPrinciple/index.html b/book/principles/openClosedPrinciple/index.html index 9268908ec8..c5e10c525d 100644 --- a/book/principles/openClosedPrinciple/index.html +++ b/book/principles/openClosedPrinciple/index.html @@ -49,7 +49,7 @@ -

    Exercises:

    Meaning of OCP


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exercises:

    Meaning of OCP


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/openClosedPrinciple/index.page-vue-render.js b/book/principles/openClosedPrinciple/index.page-vue-render.js index 7cb451a41f..2fcd190539 100644 --- a/book/principles/openClosedPrinciple/index.page-vue-render.js +++ b/book/principles/openClosedPrinciple/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_v("In object-oriented programming, OCP can be achieve with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/review/index.html b/book/principles/review/index.html index 32a36411e7..9026e888a0 100644 --- a/book/principles/review/index.html +++ b/book/principles/review/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/book/principles/review/index.page-vue-render.js b/book/principles/review/index.page-vue-render.js index 8122762dee..8a63aa6b06 100644 --- a/book/principles/review/index.page-vue-render.js +++ b/book/principles/review/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"review"}},[_c('span',[_v("Revi with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/separationOfConcernsPrinciple/index.html b/book/principles/separationOfConcernsPrinciple/index.html index fea50610cc..092e61467c 100644 --- a/book/principles/separationOfConcernsPrinciple/index.html +++ b/book/principles/separationOfConcernsPrinciple/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Can explain separation of concerns principle

    Principles →

    Separation of concerns principle

    Separation of concerns principle (SoC): To achieve better modularity, separate the code into distinct sections, such that each section addresses a separate concern. -- Proposed by Edsger W. Dijkstra

    A concern in this context is a set of information that affects the code of a computer program.

    Examples for concerns:

    • A specific feature, such as the code related to the add employee feature
    • A specific aspect, such as the code related to persistence or security
    • A specific entity, such as the code related to the Employee entity

    Applying reduces functional overlaps among code sections and also limits the ripple effect when changes are introduced to a specific part of the system.

    If the code related to persistence is separated from the code related to security, a change to how the data are persisted will not need changes to how the security is implemented.

    This principle can be applied at the class level, as well as at higher levels.

    The n-tier architecture utilizes this principle. Each layer in the architecture has a well-defined functionality that has no functional overlap with each other.

    This principle should lead to higher cohesion and lower coupling.


    Exercises:

    Correct statements about SoC


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Can explain separation of concerns principle

    Principles →

    Separation of concerns principle

    Separation of concerns principle (SoC): To achieve better modularity, separate the code into distinct sections, such that each section addresses a separate concern. -- Proposed by Edsger W. Dijkstra

    A concern in this context is a set of information that affects the code of a computer program.

    Examples for concerns:

    • A specific feature, such as the code related to the add employee feature
    • A specific aspect, such as the code related to persistence or security
    • A specific entity, such as the code related to the Employee entity

    Applying reduces functional overlaps among code sections and also limits the ripple effect when changes are introduced to a specific part of the system.

    If the code related to persistence is separated from the code related to security, a change to how the data are persisted will not need changes to how the security is implemented.

    This principle can be applied at the class level, as well as at higher levels.

    The n-tier architecture utilizes this principle. Each layer in the architecture has a well-defined functionality that has no functional overlap with each other.

    This principle should lead to higher cohesion and lower coupling.


    Exercises:

    Correct statements about SoC


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/separationOfConcernsPrinciple/index.page-vue-render.js b/book/principles/separationOfConcernsPrinciple/index.page-vue-render.js index e09be53e30..0cbe6cc566 100644 --- a/book/principles/separationOfConcernsPrinciple/index.page-vue-render.js +++ b/book/principles/separationOfConcernsPrinciple/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("This principle can be applied at the with(this){return _c('h5',{attrs:{"id":"exercises-2"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises-2","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/singleResponsibilityPrinciple/index.html b/book/principles/singleResponsibilityPrinciple/index.html index f57cd5815c..2b1b6b9890 100644 --- a/book/principles/singleResponsibilityPrinciple/index.html +++ b/book/principles/singleResponsibilityPrinciple/index.html @@ -13,7 +13,7 @@

    Can explain single responsibility principle

    Principles →

    Single responsibility principle

    Single responsibility principle (SRP): A class should have one, and only one, reason to change. -- Robert C. Martin

    If a class has only one responsibility, it needs to change only when there is a change to that responsibility.

    Consider a TextUi class that does parsing of the user commands as well as interacting with the user. That class needs to change when the formatting of the UI changes as well as when the syntax of the user command changes. Hence, such a class does not follow the SRP.

    Gather together the things that change for the same reasons. Separate those things that change for different reasons. ―- Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin


    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +by Patkos Csaba
  • A book chapter on SRP written by the father of the principle itself, Robert C Martin
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/singleResponsibilityPrinciple/index.page-vue-render.js b/book/principles/singleResponsibilityPrinciple/index.page-vue-render.js index 57cf2f6f6d..24bf7de283 100644 --- a/book/principles/singleResponsibilityPrinciple/index.page-vue-render.js +++ b/book/principles/singleResponsibilityPrinciple/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('blockquote',[_c('p',[_c('span',{staticClass:"fas fa-quote- with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"http://www.oodesign.com/single-responsibility-principle.html"}},[_v("An explanation of the SRP")]),_v(" from www.oodesign.com")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"http://code.tutsplus.com/tutorials/solid-part-1-the-single-responsibility-principle--net-36074"}},[_v("Another explanation (more detailed)")]),_v("\nby Patkos Csaba")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://drive.google.com/file/d/0ByOwmqah_nuGNHEtcU5OekdDMkk/view"}},[_v("A book chapter on SRP")]),_v(" written by the father of the principle itself, Robert C Martin")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/solidPrinciples/index.html b/book/principles/solidPrinciples/index.html index 80eda90a0b..bd8d3f75b4 100644 --- a/book/principles/solidPrinciples/index.html +++ b/book/principles/solidPrinciples/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/book/principles/solidPrinciples/index.page-vue-render.js b/book/principles/solidPrinciples/index.page-vue-render.js index 520a260bcf..b6e82648b8 100644 --- a/book/principles/solidPrinciples/index.page-vue-render.js +++ b/book/principles/solidPrinciples/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"solid-principles"}},[_c('span' with(this){return _c('p',[_v("The five OOP principles given below are known as "),_c('em',[_v("SOLID Principles")]),_v(" (an acronym made up of the first letter of each principle):")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/principles/yagniPrinciple/index.html b/book/principles/yagniPrinciple/index.html index 1b15c8f549..1758950119 100644 --- a/book/principles/yagniPrinciple/index.html +++ b/book/principles/yagniPrinciple/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Can explain YAGNI principle

    Principles →

    YAGNI principle

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    The principle says that some capability you presume your software needs in the future should not be built now because chances are "you aren't gonna need it". The rationale is that you do not have perfect information about the future and therefore some of the extra work you do to fulfill a potential future need might go to waste when some of your predictions fail to materialize.


    Resources:
    • Yagni -- A detailed article explaining YAGNI, written by Martin Fowler.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Can explain YAGNI principle

    Principles →

    YAGNI principle

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    The principle says that some capability you presume your software needs in the future should not be built now because chances are "you aren't gonna need it". The rationale is that you do not have perfect information about the future and therefore some of the extra work you do to fulfill a potential future need might go to waste when some of your predictions fail to materialize.


    Resources:
    • Yagni -- A detailed article explaining YAGNI, written by Martin Fowler.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/principles/yagniPrinciple/index.page-vue-render.js b/book/principles/yagniPrinciple/index.page-vue-render.js index 1777df2a0c..13c992daf3 100644 --- a/book/principles/yagniPrinciple/index.page-vue-render.js +++ b/book/principles/yagniPrinciple/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"yagni-principle"}},[_c('span', with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://martinfowler.com/bliki/Yagni.html"}},[_c('strong',[_v("Yagni")])]),_v(" -- A detailed article explaining YAGNI, written by Martin Fowler.")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/exampleProcessModels/index.html b/book/processModels/exampleProcessModels/index.html index 4e8ca73d26..04ab0853d7 100644 --- a/book/processModels/exampleProcessModels/index.html +++ b/book/processModels/exampleProcessModels/index.html @@ -13,7 +13,7 @@

    Project Management → SDLC Process Models → -

    Example process models

    XP

    Can explain XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.


    Scrum

    Can explain scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes



    Unified process

    Can explain the Unified Process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Example process models

    XP

    Can explain XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.


    Scrum

    Can explain scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes



    Unified process

    Can explain the Unified Process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/exampleProcessModels/index.page-vue-render.js b/book/processModels/exampleProcessModels/index.page-vue-render.js index 78c7c71f1a..279a4014ec 100644 --- a/book/processModels/exampleProcessModels/index.page-vue-render.js +++ b/book/processModels/exampleProcessModels/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"example-process-models"}},[_c('span',[_v("Example process models")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#example-process-models","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/exampleProcessModels/scrum/index.html b/book/processModels/exampleProcessModels/scrum/index.html index bb71571ac5..e0dae9d93f 100644 --- a/book/processModels/exampleProcessModels/scrum/index.html +++ b/book/processModels/exampleProcessModels/scrum/index.html @@ -13,7 +13,7 @@

    Can explain scrum

    Project Management → SDLC Process Models → -

    Scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/exampleProcessModels/scrum/index.page-vue-render.js b/book/processModels/exampleProcessModels/scrum/index.page-vue-render.js index 6a05d01936..0173a43539 100644 --- a/book/processModels/exampleProcessModels/scrum/index.page-vue-render.js +++ b/book/processModels/exampleProcessModels/scrum/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"scrum"}},[_c('span',[_v("Scrum with(this){return _c('p',[_c('strong',[_c('em',[_v("Daily Scrum")]),_v(" is another key scrum practice")]),_v(". The description below was adapted from "),_c('a',{attrs:{"href":"https://www.mountaingoatsoftware.com/agile/scrum/meetings/daily-scrum"}},[_v("https://www.mountaingoatsoftware.com")]),_v(" (emphasis added):")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/exampleProcessModels/unifiedProcess/index.html b/book/processModels/exampleProcessModels/unifiedProcess/index.html index cebbc30b63..89e8035a9e 100644 --- a/book/processModels/exampleProcessModels/unifiedProcess/index.html +++ b/book/processModels/exampleProcessModels/unifiedProcess/index.html @@ -13,7 +13,7 @@

    Can explain the Unified Process

    Project Management → SDLC Process Models → -

    Unified process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Unified process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/exampleProcessModels/unifiedProcess/index.page-vue-render.js b/book/processModels/exampleProcessModels/unifiedProcess/index.page-vue-render.js index 3505252cfa..173cda8354 100644 --- a/book/processModels/exampleProcessModels/unifiedProcess/index.page-vue-render.js +++ b/book/processModels/exampleProcessModels/unifiedProcess/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Unified process is a flexible and cus with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/exampleProcessModels/xp/index.html b/book/processModels/exampleProcessModels/xp/index.html index c739b6ed81..cf0643cde4 100644 --- a/book/processModels/exampleProcessModels/xp/index.html +++ b/book/processModels/exampleProcessModels/xp/index.html @@ -13,7 +13,7 @@

    Can explain XP

    Project Management → SDLC Process Models → -

    XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/exampleProcessModels/xp/index.page-vue-render.js b/book/processModels/exampleProcessModels/xp/index.page-vue-render.js index 2ae38fec71..61384afbd2 100644 --- a/book/processModels/exampleProcessModels/xp/index.page-vue-render.js +++ b/book/processModels/exampleProcessModels/xp/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_v("The following description was adapted from the "), with(this){return _c('p',[_c('strong',[_c('em',[_v("Pair programming, CRC cards, project velocity")]),_v(", and "),_c('em',[_v("standup meetings")]),_v(" are some interesting topics related to XP.")]),_v(" Refer to "),_c('a',{attrs:{"href":"/website/book/processModels/exampleProcessModels/xp/extremeprogramming.org"}},[_v("http://www.extremeprogramming.org")]),_v(" to find out more about XP.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/index.html b/book/processModels/index.html index 4dad35a732..4ad42c38fb 100644 --- a/book/processModels/index.html +++ b/book/processModels/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    SDLC process models

    Introduction

    What

    Can explain SDLC process models

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.


    Sequential models

    Can explain sequential process models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.


    Iterative models

    Can explain iterative process models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.


    Agile models

    Can explain agile process models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes




    Example process models

    XP

    Can explain XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.


    Scrum

    Can explain scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes



    Unified process

    Can explain the Unified Process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process




    More

    CMMI

    Can explain CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.



    Summary

    Recap

    Can explain process models at a higher level

    This section has some exercises that cover multiple topics related to SDLC process models.


    Exercises:

    Sequential vs iterative approach


    Agile processes, Pair programming, Test-driven development


    The two basic process models


    Statements about sequential and iterative process models


    Risk of overshooting a deadline




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    SDLC process models

    Introduction

    What

    Can explain SDLC process models

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.


    Sequential models

    Can explain sequential process models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.


    Iterative models

    Can explain iterative process models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.


    Agile models

    Can explain agile process models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes




    Example process models

    XP

    Can explain XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.


    Scrum

    Can explain scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes



    Unified process

    Can explain the Unified Process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process




    More

    CMMI

    Can explain CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.



    Summary

    Recap

    Can explain process models at a higher level

    This section has some exercises that cover multiple topics related to SDLC process models.


    Exercises:

    Sequential vs iterative approach


    Agile processes, Pair programming, Test-driven development


    The two basic process models


    Statements about sequential and iterative process models


    Risk of overshooting a deadline




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/index.page-vue-render.js b/book/processModels/index.page-vue-render.js index c4f9971232..3806fd7d25 100644 --- a/book/processModels/index.page-vue-render.js +++ b/book/processModels/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"sdlc-process-models"}},[_c('span',[_v("SDLC process models")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#sdlc-process-models","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/introduction/agileModels/index.html b/book/processModels/introduction/agileModels/index.html index 0bb9f8093a..c35144af71 100644 --- a/book/processModels/introduction/agileModels/index.html +++ b/book/processModels/introduction/agileModels/index.html @@ -13,7 +13,7 @@

    Can explain agile process models

    Project Management → SDLC Process Models → Introduction → -

    Agile models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Agile models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/introduction/agileModels/index.page-vue-render.js b/book/processModels/introduction/agileModels/index.page-vue-render.js index 104de44ec7..10b7ee7a3c 100644 --- a/book/processModels/introduction/agileModels/index.page-vue-render.js +++ b/book/processModels/introduction/agileModels/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("In 2001, a group of prominent software e with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/introduction/index.html b/book/processModels/introduction/index.html index f3552100be..d6f1384be9 100644 --- a/book/processModels/introduction/index.html +++ b/book/processModels/introduction/index.html @@ -13,7 +13,7 @@

    Project Management → SDLC Process Models → -

    Introduction

    What

    Can explain SDLC process models

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.


    Sequential models

    Can explain sequential process models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.


    Iterative models

    Can explain iterative process models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.


    Agile models

    Can explain agile process models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain SDLC process models

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.


    Sequential models

    Can explain sequential process models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.


    Iterative models

    Can explain iterative process models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.


    Agile models

    Can explain agile process models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/introduction/index.page-vue-render.js b/book/processModels/introduction/index.page-vue-render.js index 20ed631b32..0e7ced67a7 100644 --- a/book/processModels/introduction/index.page-vue-render.js +++ b/book/processModels/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/introduction/iterativeModels/index.html b/book/processModels/introduction/iterativeModels/index.html index 640d4ee835..a14ea3d1de 100644 --- a/book/processModels/introduction/iterativeModels/index.html +++ b/book/processModels/introduction/iterativeModels/index.html @@ -13,7 +13,7 @@

    Can explain iterative process models

    Project Management → SDLC Process Models → Introduction → -

    Iterative models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Iterative models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/introduction/iterativeModels/index.page-vue-render.js b/book/processModels/introduction/iterativeModels/index.page-vue-render.js index 57a68ed5d1..e338333f0c 100644 --- a/book/processModels/introduction/iterativeModels/index.page-vue-render.js +++ b/book/processModels/introduction/iterativeModels/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('li',[_c('strong',[_v("In the depth-first approach, an iter with(this){return _c('p',[_c('strong',[_v("A project can be done as a mixture of breadth-first and depth-first iterations")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/introduction/sequentialModels/index.html b/book/processModels/introduction/sequentialModels/index.html index 4800fb5e07..69e831e062 100644 --- a/book/processModels/introduction/sequentialModels/index.html +++ b/book/processModels/introduction/sequentialModels/index.html @@ -13,7 +13,7 @@

    Can explain sequential process models

    Project Management → SDLC Process Models → Introduction → -

    Sequential models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Sequential models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/introduction/sequentialModels/index.page-vue-render.js b/book/processModels/introduction/sequentialModels/index.page-vue-render.js index 31241dba17..4a7f13e7f7 100644 --- a/book/processModels/introduction/sequentialModels/index.page-vue-render.js +++ b/book/processModels/introduction/sequentialModels/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("This model can work well for a projec with(this){return _c('p',[_c('strong',[_v("However, real-world projects often tackle problems that are not well-understood at the beginning")]),_v(", making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/introduction/what/index.html b/book/processModels/introduction/what/index.html index 5dc37084d3..b75c33fd26 100644 --- a/book/processModels/introduction/what/index.html +++ b/book/processModels/introduction/what/index.html @@ -13,7 +13,7 @@

    Can explain SDLC process models

    Project Management → SDLC Process Models → Introduction → -

    What

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/introduction/what/index.page-vue-render.js b/book/processModels/introduction/what/index.page-vue-render.js index 1d6805eed5..aa93edc4fe 100644 --- a/book/processModels/introduction/what/index.page-vue-render.js +++ b/book/processModels/introduction/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain SDLC process models")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Project Management → SDLC Process Models → Introduction →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Software development goes through different stages such as "),_c('em',[_v("requirements, analysis, design, implementation")]),_v(" and "),_c('em',[_v("testing")]),_v(". These stages are collectively known as the "),_c('em',[_v("software development lifecycle")]),_v(" (SDLC).")]),_v(" There are several approaches, known as "),_c('em',[_v("software development lifecycle models")]),_v(" (also called "),_c('em',[_v("software process models")]),_v("), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/more/cmmi/index.html b/book/processModels/more/cmmi/index.html index c9be8aab6c..348ad797c0 100644 --- a/book/processModels/more/cmmi/index.html +++ b/book/processModels/more/cmmi/index.html @@ -13,7 +13,7 @@

    Can explain CMMI

    Project Management → SDLC Process Models → -

    CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/more/cmmi/index.page-vue-render.js b/book/processModels/more/cmmi/index.page-vue-render.js index 9af4356e20..0bd249363b 100644 --- a/book/processModels/more/cmmi/index.page-vue-render.js +++ b/book/processModels/more/cmmi/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"cmmi"}},[_c('span',[_v("CMMI") with(this){return _c('p',[_c('strong',[_v("CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level.")]),_v(" The diagram below [taken from Wikipedia] gives an overview of the five levels.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/more/index.html b/book/processModels/more/index.html index 5a1158b8c3..5ec86e3aa6 100644 --- a/book/processModels/more/index.html +++ b/book/processModels/more/index.html @@ -13,7 +13,7 @@

    Project Management → SDLC Process Models → -

    More

    CMMI

    Can explain CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    More

    CMMI

    Can explain CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/more/index.page-vue-render.js b/book/processModels/more/index.page-vue-render.js index 5f3d7ae78c..b85fb1047b 100644 --- a/book/processModels/more/index.page-vue-render.js +++ b/book/processModels/more/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"more"}},[_c('span',[_v("More")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/summary/index.html b/book/processModels/summary/index.html index a2128ddcaa..8922b36639 100644 --- a/book/processModels/summary/index.html +++ b/book/processModels/summary/index.html @@ -13,7 +13,7 @@ +

    Summary

    Recap

    Can explain process models at a higher level

    This section has some exercises that cover multiple topics related to SDLC process models.


    Exercises:

    Sequential vs iterative approach


    Agile processes, Pair programming, Test-driven development


    The two basic process models


    Statements about sequential and iterative process models


    Risk of overshooting a deadline



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/summary/index.page-vue-render.js b/book/processModels/summary/index.page-vue-render.js index db11b85508..f22986f316 100644 --- a/book/processModels/summary/index.page-vue-render.js +++ b/book/processModels/summary/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"summary"}},[_c('span',[_v("Summary")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#summary","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/processModels/summary/recap/index.html b/book/processModels/summary/recap/index.html index 5b145ec4a7..ceb495d8d2 100644 --- a/book/processModels/summary/recap/index.html +++ b/book/processModels/summary/recap/index.html @@ -13,7 +13,7 @@ +

    Recap

    This section has some exercises that cover multiple topics related to SDLC process models.


    Exercises:

    Sequential vs iterative approach


    Agile processes, Pair programming, Test-driven development


    The two basic process models


    Statements about sequential and iterative process models


    Risk of overshooting a deadline


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/processModels/summary/recap/index.page-vue-render.js b/book/processModels/summary/recap/index.page-vue-render.js index 658cffc238..53ba204b85 100644 --- a/book/processModels/summary/recap/index.page-vue-render.js +++ b/book/processModels/summary/recap/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("This section has some exercises that cov with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectDuke/index.html b/book/projectDuke/index.html index 33f6378014..4adf7e058a 100644 --- a/book/projectDuke/index.html +++ b/book/projectDuke/index.html @@ -752,7 +752,7 @@ You can select a theme too.
  • Go to https://{your username}.github.io/{repo name}/ to view the user guide of your product. Note: it could take 5-10 minutes for GitHub to update the page.
    It is important that you carefully check the content of the UG available at the above URL to ensure the HTML version of the page (auto-generated by GitHub Pages, based on your Markdown text) has the right content. In some rare cases, the page might look alright on GitHub file preview but will not render correctly on GitHub pages.
  • Minimal:

    • Ensure the chatbot name is stated clearly at the top of the User Guide.
    • Provide the reader with enough guidance to be able to use all important features of your chatbot.

    How detailed should the user guide be? It should be fit-for-purpose. i.e., think from the user's point of view and include as much information as necessary for the user (while trying to keep it as short as possible -- users don't have the patience to read lengthy user guides either), in a format as friendly to the user as possible.
    You can use the 'Features' section of this user guide as a benchmark.


    A-DevGuide

    Add a Developer Guide

    Add a Developer Guide to the project, explaining the design and implementation to future developers.


    A-Release

    Release the product

    Release the product to be used by potential users. e.g., you can make it available on GitHub


    A-BetterGui

    Improve the GUI

    Improve the GUI to make it more polished. Some examples:

    • Tweak the GUI to match the asymmetric nature of the conversation: As the conversation is between the user and the app (not between two humans), it is asymmetric in nature. Accordingly, it makes sense not to display both sides of the conversion in the same visual format.
    • Highlight errors e.g., when the user types a wrong command, the error should be shown in a different format to catch ther user's attention.
    • Tweak padding, fonts, colors, alignments to make the GUI more pleasing to look at.
      Given the app is likely to take only a small portion of the screen, and the bot replies can contain lot of text, try to optimize for space (e.g., avoid wasting display space that simply shows the background graphics).
    • Allow resizing of the Window, and ensure the content resize appropriately as the Window changes size.
    • Profile pictures: If your GUI shows profile pictures, you can tweak the way the picture is shown (e.g., crop as a circle or a square with rounded corners). In fact, an easy tweak is to use a picture with a transparent background so that it blends nicely with the background.
      -Given that the participants of the conversion are fixed (i.e., you and the chatbot), do you even need big profile pictures?
    • Focus more on tweaks that actually improves the user experience (UX). Some changes (e.g., profile pictures, background graphics) can be eye catching but can even degrade the UX if not done right (e.g., it can make the text harder to read)

    You can take inspiration from these past projects. If you adopt any ideas from them, don't forget to give credit to the original author.

    A-Personality

    Give a unique personality

    Choose a unique personality for Duke, and tweak the following aspects to go with that personality:

    • Name
    • Phrases used by Duke (e.g., when responding to a command)
    • GUI (colors, icons, font, etc.)

    A-MoreTesting

    More automated tests

    Write more JUnit tests, to test nearly all code that can be tested automatically.

    You may omit code that are hard to test automatically e.g., GUI functionality (test those manually instead).

    This can include more manual testing as well e.g., testing on different OSes, different screen resolution, different OS language settings (English vs Chinese)

    A-MoreErrorHandling

    More error handling

    Improve the code to handle all errors you anticipate the product will encounter during usage.

    Some examples of errors:

    • command format errors: multiple spaces where only one is expected, trailing/leading spaces in the command, an essential parameter missing, a parameter is specified multiple times, special characters used where they are not expected, ...
    • environment issues: an expected file is missing, access to a file is denied, a file content is not as expected, ...
    • data is not as expected: start date/time is later (or same as) than end/time, a value that should be unique is duplicated (e.g., two tasks with the same exact details), non-existent dates (e.g., Feb 30)

    A-AiAssisted

    Enhance the code using AI tools

    Use AI tools (e.g., GitHub Copilot, ChatGPT) to enhance your chatbot code. For example, you can get AI tools to help you,

    • improve the quality of the current code.
    • tweak an existing feature to make it more useful to the user.
    • add or improve documentation, tests.

    Extensions: Category B

    B-TentativeScheduling

    Tentative scheduling

    Provide a way for an event to be tentatively scheduled in multiple slots, and later to be confirmed to one the slots.


    B-Snooze

    Snoozing/postponing tasks

    Provide a way to easily snooze/postpone/reschedule tasks.


    B-RecurringTasks

    Recurring tasks

    Provide support for managing recurring tasks e.g., a weekly project meeting.


    B-DoAfterTasks

    'Do after' tasks

    Support the managing of tasks that need to be done after a specific time/task e.g., return book after the exam is over.


    B-DoWithinPeriodTasks

    'Do within a period' task

    Provide support for managing tasks that need to be done within a certain period e.g., collect certificate between Jan 15 and 25th.


    B-FixedDurationTasks

    Unscheduled tasks with a fixed duration

    Provide support for managing tasks that takes a fixed amount of time but does not have a fixed start/end time e.g., reading the sales report (needs 2 hours).


    B-Reminders

    Reminders for tasks

    Provide a way to get reminders about tasks e.g., remind the user about upcoming deadlines.


    B-FindFreeTimes

    Find free times

    Provide a way for the user to find free times e.g., when is the nearest day in which I have a 4 hour free slot?.


    B-ViewSchedules

    View schedules

    Provide a way to view tasks in the form of a schedule e.g., view the schedule for a specific date.


    B-DetectAnomalies

    Detect scheduling anomalies

    Deal with schedule anomalies e.g., detect if a task being added clashes with another task in the list.

    Extensions: Category C

    C-DetectDuplicates

    Deal duplicate items

    Add the ability to recognize and deal with duplicate items. e.g., the same task added multiple times.


    C-FlexibleDataSource

    Flexible data source

    Provide more flexibility with the data source e.g., the ability for the user to specify which file to use as the data source.


    C-Sort

    Sorting items managed by the App

    The ability to sort items e.g., sort deadlines chronologically.

    C-NaturalDates

    More natural date formats

    Support more natural date formats e.g., Mon in a user command can be interpreted as the date of the next Monday in the calendar.

    C-BetterSearch

    More flexibility in searching for items

    All more flexibility in search e.g., find items even if the keyword matches the item only partially.

    C-Update

    Easily edit items

    Support a way to easily edit details of items e.g., change the end time of an event without changing anything else.

    Minimal: the ability to update an existing item without having to delete it first

    Other ideas:

    • the ability to clone items (to easily create new items based on existing items)

    C-Tagging

    Tagging items

    Provide a way to tag items e.g., tag a task as #fun.

    C-Priority

    Prioritizing items

    Provide a way to attach priorities to items e.g., mark an item as a high priority (or priority level 1).

    C-Archive

    Archiving items

    Provide a way to archive items so that the user can remove items from the app but still keep a record of them somewhere e.g., archive all tasks in the list into a file so that the user can start over with a clean slate.

    C-MassOps

    Mass operations

    Provide a way to perform tasks on multiple items e.g., delete some specific items in one go.

    C-Statistics

    Statistics and insights

    Provide a way to leverage statistics about the items managed by the App e.g., show the number of tasks that have been completed in the past week.

    C-Undo

    Undo

    Provide a way to undo a command.

    Minimal: the ability to undo the most recent command.

    C-Help

    Give help to users

    Provide in-App guidance to users.

    Minimal: add a command to access a help page.

    Other ideas:

    • Load the App with some sample data at the first run.

    C-FriendlierSyntax

    Friendlier syntax for commands

    Make the command syntax more flexible.

    Minimal: provide shorter aliases for keywords e.g., t can be shorter alias for todo.

    Other ideas:

    • Allow users to define their own aliases
    • Remove the need for the parts of a command to be in a specific order

    Extensions: Category D

    D-Contacts

    Support managing contacts

    Support managing info about contacts e.g., details of friends

    D-Notes

    Support managing notes

    Support managing info about small snippets of textual information the user wants to record e.g., one's own waist size, a name of a movie that the user wants to remember

    D-Expenses

    Support managing expenses

    Support managing info about expenses e.g., the amounts spent on food, books, transport, etc.

    D-Loans

    Support managing loan records

    Support keeping records of loans given/taken e.g., money lent/owed to colleagues/friends

    D-Places

    Support managing info about places

    Support recording info about places e.g., info about restaurants visited, for future reference

    D-Trivia

    Support managing trivia

    Provide the ability to learn/memorize things e.g., learn vocabulary, answers to questions

    D-Clients

    Support managing client info

    Support managing info about clients e.g., for an insurance agent to keep track of clients

    D-Merchandise

    Support managing merchandise info

    Support managing info about merchandise e.g., a property agent to keep track of properties, a collector of stamps keep track of items in the collection

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Given that the participants of the conversion are fixed (i.e., you and the chatbot), do you even need big profile pictures?
  • Focus more on tweaks that actually improves the user experience (UX). Some changes (e.g., profile pictures, background graphics) can be eye catching but can even degrade the UX if not done right (e.g., it can make the text harder to read)
  • You can take inspiration from these past projects. If you adopt any ideas from them, don't forget to give credit to the original author.

    A-Personality

    Give a unique personality

    Choose a unique personality for Duke, and tweak the following aspects to go with that personality:

    • Name
    • Phrases used by Duke (e.g., when responding to a command)
    • GUI (colors, icons, font, etc.)

    A-MoreTesting

    More automated tests

    Write more JUnit tests, to test nearly all code that can be tested automatically.

    You may omit code that are hard to test automatically e.g., GUI functionality (test those manually instead).

    This can include more manual testing as well e.g., testing on different OSes, different screen resolution, different OS language settings (English vs Chinese)

    A-MoreErrorHandling

    More error handling

    Improve the code to handle all errors you anticipate the product will encounter during usage.

    Some examples of errors:

    • command format errors: multiple spaces where only one is expected, trailing/leading spaces in the command, an essential parameter missing, a parameter is specified multiple times, special characters used where they are not expected, ...
    • environment issues: an expected file is missing, access to a file is denied, a file content is not as expected, ...
    • data is not as expected: start date/time is later (or same as) than end/time, a value that should be unique is duplicated (e.g., two tasks with the same exact details), non-existent dates (e.g., Feb 30)

    A-AiAssisted

    Enhance the code using AI tools

    Use AI tools (e.g., GitHub Copilot, ChatGPT) to enhance your chatbot code. For example, you can get AI tools to help you,

    • improve the quality of the current code.
    • tweak an existing feature to make it more useful to the user.
    • add or improve documentation, tests.

    Extensions: Category B

    B-TentativeScheduling

    Tentative scheduling

    Provide a way for an event to be tentatively scheduled in multiple slots, and later to be confirmed to one the slots.


    B-Snooze

    Snoozing/postponing tasks

    Provide a way to easily snooze/postpone/reschedule tasks.


    B-RecurringTasks

    Recurring tasks

    Provide support for managing recurring tasks e.g., a weekly project meeting.


    B-DoAfterTasks

    'Do after' tasks

    Support the managing of tasks that need to be done after a specific time/task e.g., return book after the exam is over.


    B-DoWithinPeriodTasks

    'Do within a period' task

    Provide support for managing tasks that need to be done within a certain period e.g., collect certificate between Jan 15 and 25th.


    B-FixedDurationTasks

    Unscheduled tasks with a fixed duration

    Provide support for managing tasks that takes a fixed amount of time but does not have a fixed start/end time e.g., reading the sales report (needs 2 hours).


    B-Reminders

    Reminders for tasks

    Provide a way to get reminders about tasks e.g., remind the user about upcoming deadlines.


    B-FindFreeTimes

    Find free times

    Provide a way for the user to find free times e.g., when is the nearest day in which I have a 4 hour free slot?.


    B-ViewSchedules

    View schedules

    Provide a way to view tasks in the form of a schedule e.g., view the schedule for a specific date.


    B-DetectAnomalies

    Detect scheduling anomalies

    Deal with schedule anomalies e.g., detect if a task being added clashes with another task in the list.

    Extensions: Category C

    C-DetectDuplicates

    Deal duplicate items

    Add the ability to recognize and deal with duplicate items. e.g., the same task added multiple times.


    C-FlexibleDataSource

    Flexible data source

    Provide more flexibility with the data source e.g., the ability for the user to specify which file to use as the data source.


    C-Sort

    Sorting items managed by the App

    The ability to sort items e.g., sort deadlines chronologically.

    C-NaturalDates

    More natural date formats

    Support more natural date formats e.g., Mon in a user command can be interpreted as the date of the next Monday in the calendar.

    C-BetterSearch

    More flexibility in searching for items

    All more flexibility in search e.g., find items even if the keyword matches the item only partially.

    C-Update

    Easily edit items

    Support a way to easily edit details of items e.g., change the end time of an event without changing anything else.

    Minimal: the ability to update an existing item without having to delete it first

    Other ideas:

    • the ability to clone items (to easily create new items based on existing items)

    C-Tagging

    Tagging items

    Provide a way to tag items e.g., tag a task as #fun.

    C-Priority

    Prioritizing items

    Provide a way to attach priorities to items e.g., mark an item as a high priority (or priority level 1).

    C-Archive

    Archiving items

    Provide a way to archive items so that the user can remove items from the app but still keep a record of them somewhere e.g., archive all tasks in the list into a file so that the user can start over with a clean slate.

    C-MassOps

    Mass operations

    Provide a way to perform tasks on multiple items e.g., delete some specific items in one go.

    C-Statistics

    Statistics and insights

    Provide a way to leverage statistics about the items managed by the App e.g., show the number of tasks that have been completed in the past week.

    C-Undo

    Undo

    Provide a way to undo a command.

    Minimal: the ability to undo the most recent command.

    C-Help

    Give help to users

    Provide in-App guidance to users.

    Minimal: add a command to access a help page.

    Other ideas:

    • Load the App with some sample data at the first run.

    C-FriendlierSyntax

    Friendlier syntax for commands

    Make the command syntax more flexible.

    Minimal: provide shorter aliases for keywords e.g., t can be shorter alias for todo.

    Other ideas:

    • Allow users to define their own aliases
    • Remove the need for the parts of a command to be in a specific order

    Extensions: Category D

    D-Contacts

    Support managing contacts

    Support managing info about contacts e.g., details of friends

    D-Notes

    Support managing notes

    Support managing info about small snippets of textual information the user wants to record e.g., one's own waist size, a name of a movie that the user wants to remember

    D-Expenses

    Support managing expenses

    Support managing info about expenses e.g., the amounts spent on food, books, transport, etc.

    D-Loans

    Support managing loan records

    Support keeping records of loans given/taken e.g., money lent/owed to colleagues/friends

    D-Places

    Support managing info about places

    Support recording info about places e.g., info about restaurants visited, for future reference

    D-Trivia

    Support managing trivia

    Provide the ability to learn/memorize things e.g., learn vocabulary, answers to questions

    D-Clients

    Support managing client info

    Support managing info about clients e.g., for an insurance agent to keep track of clients

    D-Merchandise

    Support managing merchandise info

    Support managing info about merchandise e.g., a property agent to keep track of properties, a collector of stamps keep track of items in the collection

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectDuke/index.page-vue-render.js b/book/projectDuke/index.page-vue-render.js index ad39a07b1d..6971584f66 100644 --- a/book/projectDuke/index.page-vue-render.js +++ b/book/projectDuke/index.page-vue-render.js @@ -572,6 +572,6 @@ with(this){return _c('h3',{attrs:{"id":"d-merchandise"}},[_c('span',{staticClass with(this){return _c('p',[_v("Support managing info about merchandise "),_c('span',{staticClass:"dimmed"},[_v("e.g., a property agent to keep track of properties, a collector of stamps keep track of items in the collection")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/buffers/index.html b/book/projectPlanning/buffers/index.html index b573092ae9..09a29dd27e 100644 --- a/book/projectPlanning/buffers/index.html +++ b/book/projectPlanning/buffers/index.html @@ -13,7 +13,7 @@

    Can explain buffers

    Project Management → Project Planning → -

    Buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/buffers/index.page-vue-render.js b/book/projectPlanning/buffers/index.page-vue-render.js index 336a02c422..95893840b3 100644 --- a/book/projectPlanning/buffers/index.page-vue-render.js +++ b/book/projectPlanning/buffers/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"buffers"}},[_c('span',[_v("Buf with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("buffer")]),_v(" is time set aside to absorb any unforeseen delays.")]),_v(" It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, "),_c('strong',[_v("do not inflate task estimates to create hidden buffers")]),_v("; have explicit buffers instead. "),_c('span',{staticClass:"dimmed"},[_v("Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/ganttCharts/index.html b/book/projectPlanning/ganttCharts/index.html index bc28343c96..a506e20396 100644 --- a/book/projectPlanning/ganttCharts/index.html +++ b/book/projectPlanning/ganttCharts/index.html @@ -13,7 +13,7 @@ +

    Gantt charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/ganttCharts/index.page-vue-render.js b/book/projectPlanning/ganttCharts/index.page-vue-render.js index 73735b1ddb..5bf7aae209 100644 --- a/book/projectPlanning/ganttCharts/index.page-vue-render.js +++ b/book/projectPlanning/ganttCharts/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"gantt-charts"}},[_c('span',[_v with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("Gantt chart")]),_v(" is a 2-D bar-chart, drawn as "),_c('em',[_v("time vs tasks")])]),_v(" (represented by horizontal bars).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/index.html b/book/projectPlanning/index.html index 733dce4b2d..6e6b662ac0 100644 --- a/book/projectPlanning/index.html +++ b/book/projectPlanning/index.html @@ -20,7 +20,7 @@ Implementation
    1. User Interface
    2. Game Logic
    3. Persistency Support
    4.5 man day -
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Exercises:

    Which one is not a well-defined task?



    Milestones

    Can explain milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested

    Buffers

    Can explain buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.


    Issue trackers

    Can explain issue trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):


    Gantt charts

    Can explain Gantt charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.


    PERT charts

    Can explain PERT charts

    A PERT (Program Evaluation Review Technique) chart uses a graphical technique to show the order/sequence of tasks. It is based on the simple idea of drawing a directed graph in which:

    • Nodes or vertices capture the effort estimations of tasks, and
    • Arrows depict the precedence between tasks

    An example PERT chart for a simple software project


    md = man days

    A PERT chart can help determine the following important information:

    • The order of tasks. In the example above, Final Testing cannot begin until all coding of individual subsystems have been completed.
    • Which tasks can be done concurrently. In the example above, the various subsystem designs can start independently once the High level design is completed.
    • The shortest possible completion time. In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.
    • The Critical Path. In the example above, the shaded path is also the critical path.

    Critical path is the path in which any delay can directly affect the project duration. It is important to ensure tasks on the critical path are completed on time.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Exercises:

    Which one is not a well-defined task?



    Milestones

    Can explain milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested

    Buffers

    Can explain buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.


    Issue trackers

    Can explain issue trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):


    Gantt charts

    Can explain Gantt charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.


    PERT charts

    Can explain PERT charts

    A PERT (Program Evaluation Review Technique) chart uses a graphical technique to show the order/sequence of tasks. It is based on the simple idea of drawing a directed graph in which:

    • Nodes or vertices capture the effort estimations of tasks, and
    • Arrows depict the precedence between tasks

    An example PERT chart for a simple software project


    md = man days

    A PERT chart can help determine the following important information:

    • The order of tasks. In the example above, Final Testing cannot begin until all coding of individual subsystems have been completed.
    • Which tasks can be done concurrently. In the example above, the various subsystem designs can start independently once the High level design is completed.
    • The shortest possible completion time. In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.
    • The Critical Path. In the example above, the shaded path is also the critical path.

    Critical path is the path in which any delay can directly affect the project duration. It is important to ensure tasks on the critical path are completed on time.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/index.page-vue-render.js b/book/projectPlanning/index.page-vue-render.js index ff371ac14f..20ffb8e45a 100644 --- a/book/projectPlanning/index.page-vue-render.js +++ b/book/projectPlanning/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"project-planning"}},[_c('span',[_v("Project planning")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-planning","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/issueTrackers/index.html b/book/projectPlanning/issueTrackers/index.html index 3eb8dc517d..36b4105fe0 100644 --- a/book/projectPlanning/issueTrackers/index.html +++ b/book/projectPlanning/issueTrackers/index.html @@ -13,7 +13,7 @@

    Can explain issue trackers

    Project Management → Project Planning → -

    Issue trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Issue trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/issueTrackers/index.page-vue-render.js b/book/projectPlanning/issueTrackers/index.page-vue-render.js index a05740689f..d2039dd1f2 100644 --- a/book/projectPlanning/issueTrackers/index.page-vue-render.js +++ b/book/projectPlanning/issueTrackers/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_v("Keeping track of project tasks "),_c('span',{stati with(this){return _c('p',[_c('strong',[_v("Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress.")]),_v(" Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/milestones/index.html b/book/projectPlanning/milestones/index.html index 82e561e03f..3126961b25 100644 --- a/book/projectPlanning/milestones/index.html +++ b/book/projectPlanning/milestones/index.html @@ -13,7 +13,7 @@

    Can explain milestones

    Project Management → Project Planning → -

    Milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/milestones/index.page-vue-render.js b/book/projectPlanning/milestones/index.page-vue-render.js index 80b44bc1c7..fbdd5fc70d 100644 --- a/book/projectPlanning/milestones/index.page-vue-render.js +++ b/book/projectPlanning/milestones/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"milestones"}},[_c('span',[_v(" with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("milestone")]),_v(" is the end of a stage which indicates significant progress.")]),_v(" You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/pertCharts/index.html b/book/projectPlanning/pertCharts/index.html index cd42d984ef..b325523036 100644 --- a/book/projectPlanning/pertCharts/index.html +++ b/book/projectPlanning/pertCharts/index.html @@ -13,7 +13,7 @@

    Can explain PERT charts

    Project Management → Project Planning → -

    PERT charts

    A PERT (Program Evaluation Review Technique) chart uses a graphical technique to show the order/sequence of tasks. It is based on the simple idea of drawing a directed graph in which:

    • Nodes or vertices capture the effort estimations of tasks, and
    • Arrows depict the precedence between tasks

    An example PERT chart for a simple software project


    md = man days

    A PERT chart can help determine the following important information:

    • The order of tasks. In the example above, Final Testing cannot begin until all coding of individual subsystems have been completed.
    • Which tasks can be done concurrently. In the example above, the various subsystem designs can start independently once the High level design is completed.
    • The shortest possible completion time. In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.
    • The Critical Path. In the example above, the shaded path is also the critical path.

    Critical path is the path in which any delay can directly affect the project duration. It is important to ensure tasks on the critical path are completed on time.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    PERT charts

    A PERT (Program Evaluation Review Technique) chart uses a graphical technique to show the order/sequence of tasks. It is based on the simple idea of drawing a directed graph in which:

    • Nodes or vertices capture the effort estimations of tasks, and
    • Arrows depict the precedence between tasks

    An example PERT chart for a simple software project


    md = man days

    A PERT chart can help determine the following important information:

    • The order of tasks. In the example above, Final Testing cannot begin until all coding of individual subsystems have been completed.
    • Which tasks can be done concurrently. In the example above, the various subsystem designs can start independently once the High level design is completed.
    • The shortest possible completion time. In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.
    • The Critical Path. In the example above, the shaded path is also the critical path.

    Critical path is the path in which any delay can directly affect the project duration. It is important to ensure tasks on the critical path are completed on time.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/pertCharts/index.page-vue-render.js b/book/projectPlanning/pertCharts/index.page-vue-render.js index 2950dcf2b8..a1b7a366ac 100644 --- a/book/projectPlanning/pertCharts/index.page-vue-render.js +++ b/book/projectPlanning/pertCharts/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_v("Nodes or vertices capture the effort est with(this){return _c('ul',[_c('li',[_v("The order of tasks. "),_c('span',{staticClass:"dimmed"},[_v("In the example above, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Final Testing")]),_v(" cannot begin until all coding of individual subsystems have been completed.")])]),_v(" "),_c('li',[_v("Which tasks can be done concurrently. "),_c('span',{staticClass:"dimmed"},[_v("In the example above, the various subsystem designs can start independently once the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High level design")]),_v(" is completed.")])]),_v(" "),_c('li',[_v("The shortest possible completion time. "),_c('span',{staticClass:"dimmed"},[_v("In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.")])]),_v(" "),_c('li',[_v("The Critical Path. "),_c('span',{staticClass:"dimmed"},[_v("In the example above, the shaded path is also the critical path")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/projectPlanning/workBreakdownStructure/index.html b/book/projectPlanning/workBreakdownStructure/index.html index ebdfa48dd7..cfee00c804 100644 --- a/book/projectPlanning/workBreakdownStructure/index.html +++ b/book/projectPlanning/workBreakdownStructure/index.html @@ -21,7 +21,7 @@ Implementation
    1. User Interface
    2. Game Logic
    3. Persistency Support
    4.5 man day -
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Exercises:

    Which one is not a well-defined task?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Exercises:

    Which one is not a well-defined task?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/projectPlanning/workBreakdownStructure/index.page-vue-render.js b/book/projectPlanning/workBreakdownStructure/index.page-vue-render.js index 1378667a49..cb8df70ff4 100644 --- a/book/projectPlanning/workBreakdownStructure/index.page-vue-render.js +++ b/book/projectPlanning/workBreakdownStructure/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("All tasks should be well-defined.")]) with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/codeReviews/index.html b/book/qualityAssurance/codeReviews/index.html index b78f2c41d2..b1c71adc08 100644 --- a/book/qualityAssurance/codeReviews/index.html +++ b/book/qualityAssurance/codeReviews/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Quality Assurance → -

    Code reviews

    What

    Can explain code reviews

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Code reviews

    What

    Can explain code reviews

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/codeReviews/index.page-vue-render.js b/book/qualityAssurance/codeReviews/index.page-vue-render.js index b0ba0441d0..c07b9172bb 100644 --- a/book/qualityAssurance/codeReviews/index.page-vue-render.js +++ b/book/qualityAssurance/codeReviews/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"code-reviews"}},[_c('span',[_v("Code reviews")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#code-reviews","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/codeReviews/what/index.html b/book/qualityAssurance/codeReviews/what/index.html index af01c38196..9312b9ad80 100644 --- a/book/qualityAssurance/codeReviews/what/index.html +++ b/book/qualityAssurance/codeReviews/what/index.html @@ -13,7 +13,7 @@

    Can explain code reviews

    Quality Assurance → Quality Assurance → Code Reviews → -

    What

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/codeReviews/what/index.page-vue-render.js b/book/qualityAssurance/codeReviews/what/index.page-vue-render.js index 2096899409..80aeb7464a 100644 --- a/book/qualityAssurance/codeReviews/what/index.page-vue-render.js +++ b/book/qualityAssurance/codeReviews/what/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('ul',[_c('li',[_v("It is a manual process and therefore, er with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://developers.redhat.com/blog/2019/07/08/10-tips-for-reviewing-code-you-dont-like/"}},[_c('strong',[_v("10 tips for reviewing code you don’t like")])]),_v(" - a blog post by David Lloyd (a Red Hat developer).")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/formalVerification/index.html b/book/qualityAssurance/formalVerification/index.html index 2cbe6d5964..30389ee2f2 100644 --- a/book/qualityAssurance/formalVerification/index.html +++ b/book/qualityAssurance/formalVerification/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Quality Assurance → -

    Formal verification

    What

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Formal verification

    What

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/formalVerification/index.page-vue-render.js b/book/qualityAssurance/formalVerification/index.page-vue-render.js index d7e9e9f99d..b7ef648a6d 100644 --- a/book/qualityAssurance/formalVerification/index.page-vue-render.js +++ b/book/qualityAssurance/formalVerification/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"formal-verification"}},[_c('span',[_v("Formal verification")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#formal-verification","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/formalVerification/what/index.html b/book/qualityAssurance/formalVerification/what/index.html index fbdc9dab42..452cbeb17e 100644 --- a/book/qualityAssurance/formalVerification/what/index.html +++ b/book/qualityAssurance/formalVerification/what/index.html @@ -13,7 +13,7 @@

    Can explain formal verification

    Quality Assurance → Quality Assurance → Formal Verification → -

    What

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/formalVerification/what/index.page-vue-render.js b/book/qualityAssurance/formalVerification/what/index.page-vue-render.js index 73654d1a03..4f92fe2278 100644 --- a/book/qualityAssurance/formalVerification/what/index.page-vue-render.js +++ b/book/qualityAssurance/formalVerification/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ul',[_c('li',[_v("It only proves the compliance with the s with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/index.html b/book/qualityAssurance/index.html index c208e2f5b4..a6619bdd1d 100644 --- a/book/qualityAssurance/index.html +++ b/book/qualityAssurance/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Quality assurance

    Introduction

    What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    Validation versus verification

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification




    Code reviews

    What

    Can explain code reviews

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:


    Static analysis

    What

    Can explain static analysis

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.



    Formal verification

    What

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Quality assurance

    Introduction

    What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    Validation versus verification

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification




    Code reviews

    What

    Can explain code reviews

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:


    Static analysis

    What

    Can explain static analysis

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.



    Formal verification

    What

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/index.page-vue-render.js b/book/qualityAssurance/index.page-vue-render.js index 9b0c98eaf1..bc5527a716 100644 --- a/book/qualityAssurance/index.page-vue-render.js +++ b/book/qualityAssurance/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"quality-assurance"}},[_c('span',[_v("Quality assurance")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#quality-assurance","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/introduction/index.html b/book/qualityAssurance/introduction/index.html index 05721a2867..13aaa8440a 100644 --- a/book/qualityAssurance/introduction/index.html +++ b/book/qualityAssurance/introduction/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Quality Assurance → -

    Introduction

    What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    Validation versus verification

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    Validation versus verification

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/introduction/index.page-vue-render.js b/book/qualityAssurance/introduction/index.page-vue-render.js index 001ee0481c..88f6dd8378 100644 --- a/book/qualityAssurance/introduction/index.page-vue-render.js +++ b/book/qualityAssurance/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/introduction/validationVsVerification/index.html b/book/qualityAssurance/introduction/validationVsVerification/index.html index 9d96bcda03..23d847d979 100644 --- a/book/qualityAssurance/introduction/validationVsVerification/index.html +++ b/book/qualityAssurance/introduction/validationVsVerification/index.html @@ -13,7 +13,7 @@

    Can explain validation and verification

    Quality Assurance → Quality Assurance → Introduction → -

    Validation versus verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Validation versus verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/introduction/validationVsVerification/index.page-vue-render.js b/book/qualityAssurance/introduction/validationVsVerification/index.page-vue-render.js index 5f0f870667..401d530890 100644 --- a/book/qualityAssurance/introduction/validationVsVerification/index.page-vue-render.js +++ b/book/qualityAssurance/introduction/validationVsVerification/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_v("Quality Assurance = Validat with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/introduction/what/index.html b/book/qualityAssurance/introduction/what/index.html index dd799fac56..c23f059ad6 100644 --- a/book/qualityAssurance/introduction/what/index.html +++ b/book/qualityAssurance/introduction/what/index.html @@ -13,7 +13,7 @@ +

    What

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/introduction/what/index.page-vue-render.js b/book/qualityAssurance/introduction/what/index.page-vue-render.js index f9e002b1b7..5adf7c29c2 100644 --- a/book/qualityAssurance/introduction/what/index.page-vue-render.js +++ b/book/qualityAssurance/introduction/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain software quality assurance")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Quality Assurance → Quality Assurance → Introduction →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Software "),_c('em',[_v("Quality Assurance")]),_v(" (QA) is the process of ensuring that the software being built has the required levels of quality.")])]),_v(" "),_c('p',[_v("While testing is the most common activity used in QA, there are other complementary techniques such as "),_c('em',[_v("static analysis, code reviews,")]),_v(" and "),_c('em',[_v("formal verification")]),_v(".")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/staticAnalysis/index.html b/book/qualityAssurance/staticAnalysis/index.html index 62320dafd6..6de651a404 100644 --- a/book/qualityAssurance/staticAnalysis/index.html +++ b/book/qualityAssurance/staticAnalysis/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Quality Assurance → -

    Static analysis

    What

    Can explain static analysis

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Static analysis

    What

    Can explain static analysis

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/staticAnalysis/index.page-vue-render.js b/book/qualityAssurance/staticAnalysis/index.page-vue-render.js index 68c239e96d..79f95e3020 100644 --- a/book/qualityAssurance/staticAnalysis/index.page-vue-render.js +++ b/book/qualityAssurance/staticAnalysis/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"static-analysis"}},[_c('span',[_v("Static analysis")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#static-analysis","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/qualityAssurance/staticAnalysis/what/index.html b/book/qualityAssurance/staticAnalysis/what/index.html index 4d4fe918f6..06bd77dc9a 100644 --- a/book/qualityAssurance/staticAnalysis/what/index.html +++ b/book/qualityAssurance/staticAnalysis/what/index.html @@ -13,7 +13,7 @@

    Can explain static analysis

    Quality Assurance → Quality Assurance → Static Analysis → -

    What

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/qualityAssurance/staticAnalysis/what/index.page-vue-render.js b/book/qualityAssurance/staticAnalysis/what/index.page-vue-render.js index 710e2a352f..15ae49864a 100644 --- a/book/qualityAssurance/staticAnalysis/what/index.page-vue-render.js +++ b/book/qualityAssurance/staticAnalysis/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("Higher-end static analysis tools (sta with(this){return _c('p',[_c('strong',[_c('em',[_v("Linters")]),_v(" are a subset of static analyzers")]),_v(" that specifically aim to locate areas where the code can be made 'cleaner'.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/refactoring/how/index.html b/book/refactoring/how/index.html index d9dfcbc585..be80ef8c1d 100644 --- a/book/refactoring/how/index.html +++ b/book/refactoring/how/index.html @@ -13,7 +13,7 @@ +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/refactoring/how/index.page-vue-render.js b/book/refactoring/how/index.page-vue-render.js index bee3107cea..e44e270cda 100644 --- a/book/refactoring/how/index.page-vue-render.js +++ b/book/refactoring/how/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]) with(this){return _c('ol',[_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/consolidateConditionalExpression.html"}},[_v("Consolidate Conditional Expression")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/decomposeConditional.html"}},[_v("Decompose Conditional")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/inlineMethod.html"}},[_v("Inline Method")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/removeDoubleNegative.html"}},[_v("Remove Double Negative")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/replaceMagicLiteral.html"}},[_v("Replace Magic Literal")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html"}},[_v("Replace Nested Conditional with Guard Clauses")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/replaceParameterWithExplicitMethods.html"}},[_v("Replace Parameter with Explicit Methods")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/reverseConditional.html"}},[_v("Reverse Conditional")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/splitLoop.html"}},[_v("Split Loop")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.com/catalog/splitVariable.html"}},[_v("Split Temporary Variable")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/refactoring/index.html b/book/refactoring/index.html index 6181ad36d5..52f472c8c9 100644 --- a/book/refactoring/index.html +++ b/book/refactoring/index.html @@ -350,7 +350,7 @@

    Some IDEs have builtin support for basic refactorings such as automatically renaming a variable/method/class in all places it has been used.

    Refactoring, even if done with the aid of an IDE, may still result in regressions. Therefore, each small refactoring should be followed by regression testing.


    Exercises:

    Results of Refactoring


    Do you agree with the following statement? Refactoring and regression testing


    Explain Refactoring



    When

    Can decide when to apply a given refactoring

    One way to identify refactoring opportunities is by code smells.

    A code smell is a surface indication that usually corresponds to a deeper problem in the system. First, a smell is by definition something that's quick to spot. Second, smells don't always indicate a problem.
    --adapted from https://martinfowler.com/bliki/CodeSmell.html

    An example (from the same source as above) is the code smell data class i.e., a class with all data and no behavior. When you encounter the such a class, you can explore if refactoring it to move the corresponding behavior into that class is appropriate. Some more examples:

    Periodic refactoring is a good way to pay off the technical debt a codebase has accumulated.

    Software systems are prone to the build up of cruft - deficiencies in internal quality that make it harder than it would ideally be to modify and extend the system further.Technical Debt is a metaphor, coined by Ward Cunningham, that frames how to think about dealing with this cruft, thinking of it like a financial debt. The extra effort that it takes to add new features is the interest paid on the debt.
    ---https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).


    Resources:

    Exercises:

    ‘Extract method’ and ‘Inline method’ refactorings



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).


    Resources:

    Exercises:

    ‘Extract method’ and ‘Inline method’ refactorings



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/refactoring/index.page-vue-render.js b/book/refactoring/index.page-vue-render.js index 71650a5970..2310f626bc 100644 --- a/book/refactoring/index.page-vue-render.js +++ b/book/refactoring/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"refactoring"}},[_c('span',[_v("Refactoring")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#refactoring","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/refactoring/what/index.html b/book/refactoring/what/index.html index 7a25705676..1b484acaa2 100644 --- a/book/refactoring/what/index.html +++ b/book/refactoring/what/index.html @@ -348,7 +348,7 @@ -

    Some IDEs have builtin support for basic refactorings such as automatically renaming a variable/method/class in all places it has been used.

    Refactoring, even if done with the aid of an IDE, may still result in regressions. Therefore, each small refactoring should be followed by regression testing.


    Exercises:

    Results of Refactoring


    Do you agree with the following statement? Refactoring and regression testing


    Explain Refactoring


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Some IDEs have builtin support for basic refactorings such as automatically renaming a variable/method/class in all places it has been used.

    Refactoring, even if done with the aid of an IDE, may still result in regressions. Therefore, each small refactoring should be followed by regression testing.


    Exercises:

    Results of Refactoring


    Do you agree with the following statement? Refactoring and regression testing


    Explain Refactoring


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/refactoring/what/index.page-vue-render.js b/book/refactoring/what/index.page-vue-render.js index d711394ffe..5756dbcf16 100644 --- a/book/refactoring/what/index.page-vue-render.js +++ b/book/refactoring/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/refactoring/when/index.html b/book/refactoring/when/index.html index 021ddeefbe..eaa326b6cc 100644 --- a/book/refactoring/when/index.html +++ b/book/refactoring/when/index.html @@ -16,7 +16,7 @@

    When

    One way to identify refactoring opportunities is by code smells.

    A code smell is a surface indication that usually corresponds to a deeper problem in the system. First, a smell is by definition something that's quick to spot. Second, smells don't always indicate a problem.
    --adapted from https://martinfowler.com/bliki/CodeSmell.html

    An example (from the same source as above) is the code smell data class i.e., a class with all data and no behavior. When you encounter the such a class, you can explore if refactoring it to move the corresponding behavior into that class is appropriate. Some more examples:

    Periodic refactoring is a good way to pay off the technical debt a codebase has accumulated.

    Software systems are prone to the build up of cruft - deficiencies in internal quality that make it harder than it would ideally be to modify and extend the system further.Technical Debt is a metaphor, coined by Ward Cunningham, that frames how to think about dealing with this cruft, thinking of it like a financial debt. The extra effort that it takes to add new features is the interest paid on the debt.
    ---https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).


    Resources:

    Exercises:

    ‘Extract method’ and ‘Inline method’ refactorings


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).


    Resources:

    Exercises:

    ‘Extract method’ and ‘Inline method’ refactorings


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/refactoring/when/index.page-vue-render.js b/book/refactoring/when/index.page-vue-render.js index a7530000d0..2b66739219 100644 --- a/book/refactoring/when/index.page-vue-render.js +++ b/book/refactoring/when/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/requirements/index.html b/book/requirements/index.html index d54994daf7..985d106bcc 100644 --- a/book/requirements/index.html +++ b/book/requirements/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Requirements

    Introduction

    Can explain requirements

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.


    Exercises:

    Stakeholders of an LMS



    Non-functional requirements

    Can explain non-functional requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Exercises:

    TEAMMATES NFRs



    Prioritizing requirements

    Can explain prioritizing requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.


    Quality of requirements

    Can explain quality of requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Requirements

    Introduction

    Can explain requirements

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.


    Exercises:

    Stakeholders of an LMS



    Non-functional requirements

    Can explain non-functional requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Exercises:

    TEAMMATES NFRs



    Prioritizing requirements

    Can explain prioritizing requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.


    Quality of requirements

    Can explain quality of requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/requirements/index.page-vue-render.js b/book/requirements/index.page-vue-render.js index 0c359a7a1c..24b0c90435 100644 --- a/book/requirements/index.page-vue-render.js +++ b/book/requirements/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"requirements"}},[_c('span',[_v("Requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#requirements","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/requirements/introduction/index.html b/book/requirements/introduction/index.html index 489d4dbed3..794d139ac4 100644 --- a/book/requirements/introduction/index.html +++ b/book/requirements/introduction/index.html @@ -13,7 +13,7 @@

    Can explain requirements

    Requirements → Requirements → -

    Introduction

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.


    Exercises:

    Stakeholders of an LMS


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.


    Exercises:

    Stakeholders of an LMS


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/requirements/introduction/index.page-vue-render.js b/book/requirements/introduction/index.page-vue-render.js index 2fc858c922..03f5d99f40 100644 --- a/book/requirements/introduction/index.page-vue-render.js +++ b/book/requirements/introduction/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Identifying requirements is often not with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/requirements/nonFunctionalRequirements/index.html b/book/requirements/nonFunctionalRequirements/index.html index 4c682af974..a2b9ae52bc 100644 --- a/book/requirements/nonFunctionalRequirements/index.html +++ b/book/requirements/nonFunctionalRequirements/index.html @@ -13,7 +13,7 @@

    Can explain non-functional requirements

    Requirements → Requirements → -

    Non-functional requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Exercises:

    TEAMMATES NFRs


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Non-functional requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Exercises:

    TEAMMATES NFRs


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/requirements/nonFunctionalRequirements/index.page-vue-render.js b/book/requirements/nonFunctionalRequirements/index.page-vue-render.js index 72db2dfa19..b4d2f7e333 100644 --- a/book/requirements/nonFunctionalRequirements/index.page-vue-render.js +++ b/book/requirements/nonFunctionalRequirements/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ol',[_c('li',[_c('strong',[_v("NFRs are easier to miss")]) with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/requirements/prioritizing/index.html b/book/requirements/prioritizing/index.html index 3bccd09623..1383dc7f1b 100644 --- a/book/requirements/prioritizing/index.html +++ b/book/requirements/prioritizing/index.html @@ -13,7 +13,7 @@

    Can explain prioritizing requirements

    Requirements → Requirements → -

    Prioritizing requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Prioritizing requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/requirements/prioritizing/index.page-vue-render.js b/book/requirements/prioritizing/index.page-vue-render.js index 706ef854fd..e5f9db4a45 100644 --- a/book/requirements/prioritizing/index.page-vue-render.js +++ b/book/requirements/prioritizing/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"prioritizing-requirements"}},[ with(this){return _c('p',[_c('strong',[_v("Requirements can be prioritized based on the importance and urgency")]),_v(", while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/requirements/quality/index.html b/book/requirements/quality/index.html index c26a4c3a7f..b4b528955d 100644 --- a/book/requirements/quality/index.html +++ b/book/requirements/quality/index.html @@ -13,7 +13,7 @@

    Can explain quality of requirements

    Requirements → Requirements → -

    Quality of requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Quality of requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/requirements/quality/index.page-vue-render.js b/book/requirements/quality/index.page-vue-render.js index 4ebfb17fcb..b03784b2bf 100644 --- a/book/requirements/quality/index.page-vue-render.js +++ b/book/requirements/quality/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"quality-of-requirements"}},[_c with(this){return _c('ul',[_c('li',[_v("Consistent")]),_v(" "),_c('li',[_v("Non-redundant")]),_v(" "),_c('li',[_v("Complete")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/apis/designingAPIs/index.html b/book/reuse/apis/designingAPIs/index.html index f0347e5e56..54e2fd4670 100644 --- a/book/reuse/apis/designingAPIs/index.html +++ b/book/reuse/apis/designingAPIs/index.html @@ -13,7 +13,7 @@

    Can design reasonable quality APIs

    Implementation → Reuse → APIs → -

    Designing APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Designing APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/apis/designingAPIs/index.page-vue-render.js b/book/reuse/apis/designingAPIs/index.page-vue-render.js index 173e5d2e32..1fb45ce89f 100644 --- a/book/reuse/apis/designingAPIs/index.page-vue-render.js +++ b/book/reuse/apis/designingAPIs/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"designing-apis"}},[_c('span',[ with(this){return _c('p',[_v("You can use UML "),_c('em',[_v("sequence diagrams")]),_v(" to analyze the required interactions between components in order to discover the required API. Given below is an example.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/apis/index.html b/book/reuse/apis/index.html index 686836a14f..7cb48c5d96 100644 --- a/book/reuse/apis/index.html +++ b/book/reuse/apis/index.html @@ -13,7 +13,7 @@

    Implementation → Reuse → -

    APIs

    What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    Designing APIs

    Can design reasonable quality APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    APIs

    What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    Designing APIs

    Can design reasonable quality APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/apis/index.page-vue-render.js b/book/reuse/apis/index.page-vue-render.js index 2576f4d191..ff343e4103 100644 --- a/book/reuse/apis/index.page-vue-render.js +++ b/book/reuse/apis/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"apis"}},[_c('span',[_v("APIs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#apis","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/apis/what/index.html b/book/reuse/apis/what/index.html index d5f4443482..a266bc217c 100644 --- a/book/reuse/apis/what/index.html +++ b/book/reuse/apis/what/index.html @@ -13,7 +13,7 @@

    Can explain APIs

    Implementation → Reuse → APIs → -

    What

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/apis/what/index.page-vue-render.js b/book/reuse/apis/what/index.page-vue-render.js index 73bfaac082..5b77a95642 100644 --- a/book/reuse/apis/what/index.page-vue-render.js +++ b/book/reuse/apis/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_v("When developing large systems, if you define the A with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/cloudComputing/index.html b/book/reuse/cloudComputing/index.html index ddce05f6d1..7055205036 100644 --- a/book/reuse/cloudComputing/index.html +++ b/book/reuse/cloudComputing/index.html @@ -13,7 +13,7 @@

    Implementation → Reuse → -

    Cloud computing

    What

    Can explain cloud computing

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.


    Iaas, PaaS, and SaaS

    Can distinguish between IaaS, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Cloud computing

    What

    Can explain cloud computing

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.


    Iaas, PaaS, and SaaS

    Can distinguish between IaaS, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/cloudComputing/index.page-vue-render.js b/book/reuse/cloudComputing/index.page-vue-render.js index 346a1ffc23..d5117cafdd 100644 --- a/book/reuse/cloudComputing/index.page-vue-render.js +++ b/book/reuse/cloudComputing/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"cloud-computing"}},[_c('span',[_v("Cloud computing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#cloud-computing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/cloudComputing/services/index.html b/book/reuse/cloudComputing/services/index.html index ce1b92099d..ba2da7343b 100644 --- a/book/reuse/cloudComputing/services/index.html +++ b/book/reuse/cloudComputing/services/index.html @@ -13,7 +13,7 @@

    Can distinguish between IaaS, PaaS, and SaaS

    Implementation → Reuse → Cloud Computing → -

    Iaas, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Iaas, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/cloudComputing/services/index.page-vue-render.js b/book/reuse/cloudComputing/services/index.page-vue-render.js index aa0e360eab..1e980f5ffe 100644 --- a/book/reuse/cloudComputing/services/index.page-vue-render.js +++ b/book/reuse/cloudComputing/services/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ol',[_c('li',[_c('p',[_c('strong',[_v("Infrastructure as a with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/cloudComputing/what/index.html b/book/reuse/cloudComputing/what/index.html index ce14be6165..3d67ad1cb5 100644 --- a/book/reuse/cloudComputing/what/index.html +++ b/book/reuse/cloudComputing/what/index.html @@ -13,7 +13,7 @@

    Can explain cloud computing

    Implementation → Reuse → Cloud Computing → -

    What

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/cloudComputing/what/index.page-vue-render.js b/book/reuse/cloudComputing/what/index.page-vue-render.js index e487fe2fb8..fdd35d6e6c 100644 --- a/book/reuse/cloudComputing/what/index.page-vue-render.js +++ b/book/reuse/cloudComputing/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain cloud computing")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Reuse → Cloud Computing →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("Cloud computing is the delivery of computing as a service over the network")]),_v(", rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/frameworks/frameworksVsLibraries/index.html b/book/reuse/frameworks/frameworksVsLibraries/index.html index 0d2b3b6132..a00c4129cb 100644 --- a/book/reuse/frameworks/frameworksVsLibraries/index.html +++ b/book/reuse/frameworks/frameworksVsLibraries/index.html @@ -13,7 +13,7 @@

    Can differentiate between frameworks and libraries

    Implementation → Reuse → Frameworks → -

    Frameworks versus libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Frameworks versus libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/frameworks/frameworksVsLibraries/index.page-vue-render.js b/book/reuse/frameworks/frameworksVsLibraries/index.page-vue-render.js index bc73c4e18b..f596a9b381 100644 --- a/book/reuse/frameworks/frameworksVsLibraries/index.page-vue-render.js +++ b/book/reuse/frameworks/frameworksVsLibraries/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("Although both frameworks and libraries a with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/frameworks/index.html b/book/reuse/frameworks/index.html index e095bd6430..2d82123eb0 100644 --- a/book/reuse/frameworks/index.html +++ b/book/reuse/frameworks/index.html @@ -13,7 +13,7 @@

    Implementation → Reuse → -

    Frameworks

    What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks versus libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Frameworks

    What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks versus libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/frameworks/index.page-vue-render.js b/book/reuse/frameworks/index.page-vue-render.js index 2a328e830f..e36a2e9b33 100644 --- a/book/reuse/frameworks/index.page-vue-render.js +++ b/book/reuse/frameworks/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"frameworks"}},[_c('span',[_v("Frameworks")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#frameworks","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/frameworks/what/index.html b/book/reuse/frameworks/what/index.html index 56b409c2b9..dc31e6f1dc 100644 --- a/book/reuse/frameworks/what/index.html +++ b/book/reuse/frameworks/what/index.html @@ -13,7 +13,7 @@

    Can explain frameworks

    Implementation → Reuse → Frameworks → -

    What

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/frameworks/what/index.page-vue-render.js b/book/reuse/frameworks/what/index.page-vue-render.js index 0c3755ca64..91bb71c91d 100644 --- a/book/reuse/frameworks/what/index.page-vue-render.js +++ b/book/reuse/frameworks/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("Some frameworks provide a complete im with(this){return _c('p',[_c('strong',[_v("A framework facilitates the adaptation and customization of some desired functionality.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/index.html b/book/reuse/index.html index b302f23e4f..cdd8b60e76 100644 --- a/book/reuse/index.html +++ b/book/reuse/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Reuse

    Introduction

    What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework




    APIs

    What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    Designing APIs

    Can design reasonable quality APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.


    Libraries

    What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.


    Frameworks

    What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks versus libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?




    Platforms

    What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.


    Cloud computing

    What

    Can explain cloud computing

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.


    Iaas, PaaS, and SaaS

    Can distinguish between IaaS, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Reuse

    Introduction

    What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework




    APIs

    What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    Designing APIs

    Can design reasonable quality APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.


    Libraries

    What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.


    Frameworks

    What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks versus libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?




    Platforms

    What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.


    Cloud computing

    What

    Can explain cloud computing

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.


    Iaas, PaaS, and SaaS

    Can distinguish between IaaS, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/index.page-vue-render.js b/book/reuse/index.page-vue-render.js index ee9086e030..5e630e7bdd 100644 --- a/book/reuse/index.page-vue-render.js +++ b/book/reuse/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"reuse"}},[_c('span',[_v("Reuse")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#reuse","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/introduction/index.html b/book/reuse/introduction/index.html index 3f2e4aab61..4604ec6b3d 100644 --- a/book/reuse/introduction/index.html +++ b/book/reuse/introduction/index.html @@ -13,7 +13,7 @@

    Implementation → Reuse → -

    Introduction

    What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/introduction/index.page-vue-render.js b/book/reuse/introduction/index.page-vue-render.js index e5bfe76685..ba1e625451 100644 --- a/book/reuse/introduction/index.page-vue-render.js +++ b/book/reuse/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/introduction/what/index.html b/book/reuse/introduction/what/index.html index 64fbf3dc8c..b03c253e18 100644 --- a/book/reuse/introduction/what/index.html +++ b/book/reuse/introduction/what/index.html @@ -13,7 +13,7 @@ +

    What

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/introduction/what/index.page-vue-render.js b/book/reuse/introduction/what/index.page-vue-render.js index 4600ed939e..32c4315250 100644 --- a/book/reuse/introduction/what/index.page-vue-render.js +++ b/book/reuse/introduction/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain software reuse")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Implementation → Reuse → Introduction →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Reuse is a major theme in software engineering practices. "),_c('strong',[_v("By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement.")]),_v(" Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/introduction/when/index.html b/book/reuse/introduction/when/index.html index 87d1940029..d72e73c020 100644 --- a/book/reuse/introduction/when/index.html +++ b/book/reuse/introduction/when/index.html @@ -13,7 +13,7 @@

    Can explain the costs and benefits of reuse

    Implementation → Reuse → Introduction → -

    When

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/introduction/when/index.page-vue-render.js b/book/reuse/introduction/when/index.page-vue-render.js index d1c9c9c271..4a1dbae89d 100644 --- a/book/reuse/introduction/when/index.page-vue-render.js +++ b/book/reuse/introduction/when/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_v("While you may be tempted to use many lib with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/libraries/how/index.html b/book/reuse/libraries/how/index.html index b4a1af2092..6f23f547fe 100644 --- a/book/reuse/libraries/how/index.html +++ b/book/reuse/libraries/how/index.html @@ -13,7 +13,7 @@

    Can make use of a library

    Implementation → Reuse → Libraries → -

    How

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/libraries/how/index.page-vue-render.js b/book/reuse/libraries/how/index.page-vue-render.js index a629fcc130..e9d9909551 100644 --- a/book/reuse/libraries/how/index.page-vue-render.js +++ b/book/reuse/libraries/how/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/libraries/index.html b/book/reuse/libraries/index.html index 973b49ab39..7153757c08 100644 --- a/book/reuse/libraries/index.html +++ b/book/reuse/libraries/index.html @@ -13,7 +13,7 @@

    Implementation → Reuse → -

    Libraries

    What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Libraries

    What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/libraries/index.page-vue-render.js b/book/reuse/libraries/index.page-vue-render.js index e16ba56a57..5c15c929f1 100644 --- a/book/reuse/libraries/index.page-vue-render.js +++ b/book/reuse/libraries/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"libraries"}},[_c('span',[_v("Libraries")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#libraries","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/libraries/what/index.html b/book/reuse/libraries/what/index.html index 01f0f307d3..a4080f9596 100644 --- a/book/reuse/libraries/what/index.html +++ b/book/reuse/libraries/what/index.html @@ -13,7 +13,7 @@

    Can explain libraries

    Implementation → Reuse → Libraries → -

    What

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/libraries/what/index.page-vue-render.js b/book/reuse/libraries/what/index.page-vue-render.js index 330da384b8..988e53cb02 100644 --- a/book/reuse/libraries/what/index.page-vue-render.js +++ b/book/reuse/libraries/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/platforms/index.html b/book/reuse/platforms/index.html index 7cb6fdeef1..525df37368 100644 --- a/book/reuse/platforms/index.html +++ b/book/reuse/platforms/index.html @@ -13,7 +13,7 @@

    Implementation → Reuse → -

    Platforms

    What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Platforms

    What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/platforms/index.page-vue-render.js b/book/reuse/platforms/index.page-vue-render.js index 275c9282a6..d58570bc77 100644 --- a/book/reuse/platforms/index.page-vue-render.js +++ b/book/reuse/platforms/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"platforms"}},[_c('span',[_v("Platforms")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#platforms","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/reuse/platforms/what/index.html b/book/reuse/platforms/what/index.html index a4be986a86..26e4c564dc 100644 --- a/book/reuse/platforms/what/index.html +++ b/book/reuse/platforms/what/index.html @@ -13,7 +13,7 @@

    Can explain platforms

    Implementation → Reuse → Platforms → -

    What

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/reuse/platforms/what/index.page-vue-render.js b/book/reuse/platforms/what/index.page-vue-render.js index ca6c853d25..ff339abc8d 100644 --- a/book/reuse/platforms/what/index.page-vue-render.js +++ b/book/reuse/platforms/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("platform")]),_v(" provides a runtime environment for applications.")]),_v(" A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/branching/index.html b/book/revisionControl/branching/index.html index 2a2af80fee..2e14b26369 100644 --- a/book/revisionControl/branching/index.html +++ b/book/revisionControl/branching/index.html @@ -13,7 +13,7 @@

    Can explain branching

    Project Management → Revision Control → -

    Branching

    Branching is the process of evolving multiple versions of the software in parallel. For example, one team member can create a new branch and add an experimental feature to it while the rest of the team keeps working on another branch. Branches can be given names e.g. master, release, dev.

    A branch can be merged into another branch. Merging sometimes results in a new commit (called the merge commit) being created, to represent the cumulative changes done in the receiving branch as a result of the merge.

    Branching and merging

    Merge conflicts happen when you try to merge two branches that had changed the same part of the code and the RCS cannot decide which changes to keep. In those cases, you have to ‘resolve’ the conflicts manually.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Branching

    Branching is the process of evolving multiple versions of the software in parallel. For example, one team member can create a new branch and add an experimental feature to it while the rest of the team keeps working on another branch. Branches can be given names e.g. master, release, dev.

    A branch can be merged into another branch. Merging sometimes results in a new commit (called the merge commit) being created, to represent the cumulative changes done in the receiving branch as a result of the merge.

    Branching and merging

    Merge conflicts happen when you try to merge two branches that had changed the same part of the code and the RCS cannot decide which changes to keep. In those cases, you have to ‘resolve’ the conflicts manually.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/branching/index.page-vue-render.js b/book/revisionControl/branching/index.page-vue-render.js index aa001d8e2e..49820c6950 100644 --- a/book/revisionControl/branching/index.page-vue-render.js +++ b/book/revisionControl/branching/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("A branch can be "),_c('em',[_v("merge with(this){return _c('strong',[_c('em',[_v("Merge conflicts")]),_v(" happen when you try to merge two branches that had changed the same part of the code")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/centralizedFlow/index.html b/book/revisionControl/centralizedFlow/index.html index 6f3d058313..c60923f540 100644 --- a/book/revisionControl/centralizedFlow/index.html +++ b/book/revisionControl/centralizedFlow/index.html @@ -13,7 +13,7 @@ +

    Centralized flow

    The centralized workflow is similar to the feature branch workflow except all changes are done in the master branch.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/centralizedFlow/index.page-vue-render.js b/book/revisionControl/centralizedFlow/index.page-vue-render.js index 5bbc367463..5959321ed4 100644 --- a/book/revisionControl/centralizedFlow/index.page-vue-render.js +++ b/book/revisionControl/centralizedFlow/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain centralized flow")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Project Management → Revision Control →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"centralized-flow"}},[_c('span',[_v("Centralized flow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#centralized-flow","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_v("The "),_c('em',[_v("centralized workflow")]),_v(" is similar to the feature branch workflow except all changes are done in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch.")])])]),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#centralized-workflow"}},[_v("A detailed explanation of the Centralized Workflow")]),_v(" - From Atlassian")])])])])])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/drcsVsCrcs/index.html b/book/revisionControl/drcsVsCrcs/index.html index 081a69fe80..38769699c7 100644 --- a/book/revisionControl/drcsVsCrcs/index.html +++ b/book/revisionControl/drcsVsCrcs/index.html @@ -13,7 +13,7 @@

    Can explain DRCS vs CRCS

    Project Management → Revision Control → -

    DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/drcsVsCrcs/index.page-vue-render.js b/book/revisionControl/drcsVsCrcs/index.page-vue-render.js index 85072c169e..d7c4bb2e03 100644 --- a/book/revisionControl/drcsVsCrcs/index.page-vue-render.js +++ b/book/revisionControl/drcsVsCrcs/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Centralized RCS (CRCS for short) uses with(this){return _c('p',[_c('strong',[_v("Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos")]),_v(" working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/featureBranchFlow/index.html b/book/revisionControl/featureBranchFlow/index.html index d196ceb94c..87d22ad593 100644 --- a/book/revisionControl/featureBranchFlow/index.html +++ b/book/revisionControl/featureBranchFlow/index.html @@ -13,7 +13,7 @@

    Can explain feature branch flow

    Project Management → Revision Control → -

    Feature branch flow

    Feature branch workflow is similar to forking workflow except there are no forks. Everyone is pushing/pulling from the same remote repo. The phrase feature branch is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the master branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.

    As this workflow require all team members to have write access to the repository,

    • it is better to protect the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.
    • it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Feature branch flow

    Feature branch workflow is similar to forking workflow except there are no forks. Everyone is pushing/pulling from the same remote repo. The phrase feature branch is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the master branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.

    As this workflow require all team members to have write access to the repository,

    • it is better to protect the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.
    • it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/featureBranchFlow/index.page-vue-render.js b/book/revisionControl/featureBranchFlow/index.page-vue-render.js index a3816eb44b..25a7dbfebd 100644 --- a/book/revisionControl/featureBranchFlow/index.page-vue-render.js +++ b/book/revisionControl/featureBranchFlow/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_v("it is better to "),_c('em',[_v("protect" with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#feature-branch-workflow"}},[_v("A detailed explanation of the Feature Branch Workflow")]),_v(" - From Atlassian")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/forkingWorkflow/index.html b/book/revisionControl/forkingWorkflow/index.html index 0846513692..152bc10abf 100644 --- a/book/revisionControl/forkingWorkflow/index.html +++ b/book/revisionControl/forkingWorkflow/index.html @@ -14,7 +14,7 @@

    Can explain forking workflow

    Project Management → Revision Control →

    Forking flow

    In the forking workflow, the 'official' version of the software is kept in a remote repo designated as the 'main repo'. All team members fork the main repo and create pull requests from their fork to the main repo.

    To illustrate how the workflow goes, let’s assume Jean wants to fix a bug in the code. Here are the steps:

    1. Jean creates a separate branch in her local repo and fixes the bug in that branch.
      Common mistake: Doing the proposed changes in the master branch -- if Jean does that, she will not be able to have more than one PR open at any time because any changes to the master branch will be reflected in all open PRs.
    2. Jean pushes the branch to her fork.
    3. Jean creates a pull request from that branch in her fork to the main repo.
    4. Other members review Jean’s pull request.
    5. If reviewers suggested any changes, Jean updates the PR accordingly.
    6. When reviewers are satisfied with the PR, one of the members (usually the team lead or a designated 'maintainer' of the main repo) merges the PR, which brings Jean’s code to the main repo.
    7. Other members, realizing there is new code in the upstream repo, sync their forks with the new upstream repo (i.e. the main repo). This is done by pulling the new code to their own local repo and pushing the updated code to their own fork. If there are unmerged branches in the local repo, they can be updated too e.g., by merging the new master branch to each of them.
      Possible mistake: Creating another 'reverse' PR from the team repo to the team member's fork to sync the member's fork with the merged code. PRs are meant to go from downstream repos to upstream repos, not in the other direction.

    One main benefit of this workflow is that it does not require most contributors to have write permissions to the main repository. Only those who are merging PRs need write permissions. -The main drawback of this workflow is the extra overhead of sending everything through forks.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +The main drawback of this workflow is the extra overhead of sending everything through forks.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/forkingWorkflow/index.page-vue-render.js b/book/revisionControl/forkingWorkflow/index.page-vue-render.js index 93ef453765..7232511e43 100644 --- a/book/revisionControl/forkingWorkflow/index.page-vue-render.js +++ b/book/revisionControl/forkingWorkflow/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("In the "),_c('em',[_v("forking workfl with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#forking-workflow"}},[_v("A detailed explanation of the Forking Workflow")]),_v(" - From Atlassian")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/index.html b/book/revisionControl/index.html index f2bc2357a6..8afdd153d0 100644 --- a/book/revisionControl/index.html +++ b/book/revisionControl/index.html @@ -14,7 +14,7 @@

    Revision control

    What

    Can explain revision control

    Given below is a general introduction to revision control, adapted from bryan-mercurial-guide:

    Revision control is the process of managing multiple versions of a piece of information. In its simplest form, this is something that many people do by hand: every time you modify a file, save it under a new name that contains a number, each one higher than the number of the preceding version.

    Manually managing multiple versions of even a single file is an error-prone task, though, so software tools to help automate this process have long been available. The earliest automated revision control tools were intended to help a single user to manage revisions of a single file. Over the past few decades, the scope of revision control tools has expanded greatly; they now manage multiple files, and help multiple people to work together. The best modern revision control tools have no problem coping with thousands of people working together on projects that consist of hundreds of thousands of files.

    There are a number of reasons why you or your team might want to use an automated revision control tool for a project.

    • It will track the history and evolution of your project, so you don't have to. For every change, you'll have a log of who made it; why they made it; when they made it; and what the change was.
    • It makes it easier for you to collaborate when you're working with other people. For example, when people more or less simultaneously make potentially incompatible changes, the software will help you to identify and resolve those conflicts.
    • It can help you to recover from mistakes. If you make a change that later turns out to be an error, you can revert to an earlier version of one or more files. In fact, a really good revision control tool will even help you to efficiently figure out exactly when a problem was introduced.
    • It will help you to work simultaneously on, and manage the drift between, multiple versions of your project.

    Most of these reasons are equally valid, at least in theory, whether you're working on a project by yourself, or with a hundred other people.



    Revision: A revision (some seem to use it interchangeably with version while others seem to distinguish the two -- here, let us treat them as the same, for simplicity) is a state of a piece of information at a specific time that is a result of some changes to it e.g., if you modify the code and save the file, you have a new revision (or a new version) of that file.

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Revision control software are also known as Version Control Software (VCS), and by a few other names.

    Git is the most widely used RCS today. Other RCS tools include Mercurial, Subversion (SVN), Perforce, CVS (Concurrent Versions System), Bazaar, TFS (Team Foundation Server), and Clearcase.

    Github is a web-based project hosting platform for projects using Git for revision control. Other similar services include GitLab, BitBucket, and SourceForge.


    Repositories

    Can explain repositories

    The repository is the database that stores the revision history. Suppose you want to apply revision control on files in a directory called ProjectFoo. In that case, you need to set up a repo (short for repository) in the ProjectFoo directory, which is referred to as the working directory of the repo. For example, Git uses a hidden folder named .git inside the working directory, to store the database of the working directory's revision history.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    You can have multiple repos in your computer, each repo revision-controlling files of a different working directory, for examples, files of different projects.




    Saving history

    Can explain saving history

    Tracking and ignoring

    In a repo, you can specify which files to track and which files to ignore. For example, we can configure Git to ignore temporary files created during the build/test process, as it does not make sense to track their version history.

    Staging and committing

    Committing saves a snapshot of the current state of the tracked files in the revision control history. Such a snapshot is also called a commit (i.e. the noun).

    Commit (noun): a change (aka a revision) saved in the Git revision history.
    (verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    When ready to commit, you first add the specific changes you want to commit to a staging area. This intermediate step allows you to commit only some changes while saving other changes for a later commit.

    Stage (verb): Instructing Git to prepare a file for committing.




    Using history

    Can explain basic concepts of how RCS history is used

    RCS tools store the history of the working directory as a series of commits. This means you should commit after each change that you want the RCS to 'remember'.

    Each commit in a repo is a recorded point in the history of the project that is uniquely identified by an auto-generated hash e.g. a16043703f28e5b3dab95915f5c5e5bf4fdc5fc1.

    You can tag a specific commit with a more easily identifiable name e.g. v1.0.2.

    To see what changed between two points of the history, you can ask the RCS tool to diff the two commits in concern.

    To restore the state of the working directory at a point in the past, you can checkout the commit in concern. i.e., you can traverse the history of the working directory simply by checking out the commits you are interested in.


    Remote repositories

    Can explain remote repositories

    Remote repositories are repos that are hosted on remote computers and allow remote access. They are especially useful for sharing the revision history of a codebase among team members of a multi-person project. They can also serve as a remote backup of your codebase.

    It is possible to set up your own remote repo on a server, but the easier option is to use a remote repo hosting service such as GitHub or BitBucket.

    You can clone a repo to create a copy of that repo in another location on your computer. The copy will even have the revision history of the original repo i.e., identical to the original repo. For example, you can clone a remote repo onto your computer to create a local copy of the remote repo.

    When you clone from a repo, the original repo is commonly referred to as the upstream repo. A repo can have multiple upstream repos. For example, let's say a repo repo1 was cloned as repo2 which was then cloned as repo3. In this case, repo1 and repo2 are upstream repos of repo3.

    You can pull (or fetch) from one repo to another, to receive new commits in the second repo, but only if the repos have a shared history. Let's say some new commits were added to the after you cloned it, and you would like to copy over those new commits to your own clone i.e., sync your clone with the upstream repo. In that case, you can pull from the upstream repo to your clone.

    You can push new commits in one repo to another repo which will copy the new commits onto the destination repo. Note that pushing to a repo requires you to have write-access to it. Furthermore, you can push between repos only if those repos have a shared history among them (i.e., one was created by copying the other at some point in the past).

    Cloning, pushing, and pulling/fetching can be done between two local repos too, although it is more common for them to involve a remote repo.

    A repo can work with any number of other repositories as long as they have a shared history e.g., repo1 can pull from (or push to) repo2 and repo3 if they have a shared history between them.

    A fork is a remote copy of a remote repo. As you know, cloning creates a local copy of a repo. In contrast, forking creates a remote copy of a repo hosted on remote service such as GitHub. This is particularly useful if you want to play around with a GitHub repo, but you don't have write permissions to it; you can simply fork the repo and do whatever you want with the fork as you are the owner of the fork.

    A pull request (PR for short) is a mechanism for contributing code to a remote repo i.e., "I'm requesting you to pull my proposed changes to your repo". It's feature provided by RCS platforms such as GitHub. For this to work, the two repos must have a shared history. The most common case is sending PRs from a fork to its repo.

    Here is a scenario that includes all the concepts introduced above (click inside the slide to advance the animation):


    Branching

    Can explain branching

    Branching is the process of evolving multiple versions of the software in parallel. For example, one team member can create a new branch and add an experimental feature to it while the rest of the team keeps working on another branch. Branches can be given names e.g. master, release, dev.

    A branch can be merged into another branch. Merging sometimes results in a new commit (called the merge commit) being created, to represent the cumulative changes done in the receiving branch as a result of the merge.

    Branching and merging

    Merge conflicts happen when you try to merge two branches that had changed the same part of the code and the RCS cannot decide which changes to keep. In those cases, you have to ‘resolve’ the conflicts manually.


    DRCS vs CRCS

    Can explain DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach


    Forking flow

    Can explain forking workflow

    In the forking workflow, the 'official' version of the software is kept in a remote repo designated as the 'main repo'. All team members fork the main repo and create pull requests from their fork to the main repo.

    To illustrate how the workflow goes, let’s assume Jean wants to fix a bug in the code. Here are the steps:

    1. Jean creates a separate branch in her local repo and fixes the bug in that branch.
      Common mistake: Doing the proposed changes in the master branch -- if Jean does that, she will not be able to have more than one PR open at any time because any changes to the master branch will be reflected in all open PRs.
    2. Jean pushes the branch to her fork.
    3. Jean creates a pull request from that branch in her fork to the main repo.
    4. Other members review Jean’s pull request.
    5. If reviewers suggested any changes, Jean updates the PR accordingly.
    6. When reviewers are satisfied with the PR, one of the members (usually the team lead or a designated 'maintainer' of the main repo) merges the PR, which brings Jean’s code to the main repo.
    7. Other members, realizing there is new code in the upstream repo, sync their forks with the new upstream repo (i.e. the main repo). This is done by pulling the new code to their own local repo and pushing the updated code to their own fork. If there are unmerged branches in the local repo, they can be updated too e.g., by merging the new master branch to each of them.
      Possible mistake: Creating another 'reverse' PR from the team repo to the team member's fork to sync the member's fork with the merged code. PRs are meant to go from downstream repos to upstream repos, not in the other direction.

    One main benefit of this workflow is that it does not require most contributors to have write permissions to the main repository. Only those who are merging PRs need write permissions. -The main drawback of this workflow is the extra overhead of sending everything through forks.


    Feature branch flow

    Can explain feature branch flow

    Feature branch workflow is similar to forking workflow except there are no forks. Everyone is pushing/pulling from the same remote repo. The phrase feature branch is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the master branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.

    As this workflow require all team members to have write access to the repository,

    • it is better to protect the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.
    • it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.


    Centralized flow

    Can explain centralized flow

    The centralized workflow is similar to the feature branch workflow except all changes are done in the master branch.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +The main drawback of this workflow is the extra overhead of sending everything through forks.


    Feature branch flow

    Can explain feature branch flow

    Feature branch workflow is similar to forking workflow except there are no forks. Everyone is pushing/pulling from the same remote repo. The phrase feature branch is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the master branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.

    As this workflow require all team members to have write access to the repository,

    • it is better to protect the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.
    • it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.


    Centralized flow

    Can explain centralized flow

    The centralized workflow is similar to the feature branch workflow except all changes are done in the master branch.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/index.page-vue-render.js b/book/revisionControl/index.page-vue-render.js index 411e9ce62c..977b50caf9 100644 --- a/book/revisionControl/index.page-vue-render.js +++ b/book/revisionControl/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"revision-control"}},[_c('span',[_v("Revision control")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#revision-control","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/remoteRepositories/index.html b/book/revisionControl/remoteRepositories/index.html index 9b566e2e69..fddca50ccc 100644 --- a/book/revisionControl/remoteRepositories/index.html +++ b/book/revisionControl/remoteRepositories/index.html @@ -13,7 +13,7 @@

    Can explain remote repositories

    Project Management → Revision Control → -

    Remote repositories

    Remote repositories are repos that are hosted on remote computers and allow remote access. They are especially useful for sharing the revision history of a codebase among team members of a multi-person project. They can also serve as a remote backup of your codebase.

    It is possible to set up your own remote repo on a server, but the easier option is to use a remote repo hosting service such as GitHub or BitBucket.

    You can clone a repo to create a copy of that repo in another location on your computer. The copy will even have the revision history of the original repo i.e., identical to the original repo. For example, you can clone a remote repo onto your computer to create a local copy of the remote repo.

    When you clone from a repo, the original repo is commonly referred to as the upstream repo. A repo can have multiple upstream repos. For example, let's say a repo repo1 was cloned as repo2 which was then cloned as repo3. In this case, repo1 and repo2 are upstream repos of repo3.

    You can pull (or fetch) from one repo to another, to receive new commits in the second repo, but only if the repos have a shared history. Let's say some new commits were added to the after you cloned it, and you would like to copy over those new commits to your own clone i.e., sync your clone with the upstream repo. In that case, you can pull from the upstream repo to your clone.

    You can push new commits in one repo to another repo which will copy the new commits onto the destination repo. Note that pushing to a repo requires you to have write-access to it. Furthermore, you can push between repos only if those repos have a shared history among them (i.e., one was created by copying the other at some point in the past).

    Cloning, pushing, and pulling/fetching can be done between two local repos too, although it is more common for them to involve a remote repo.

    A repo can work with any number of other repositories as long as they have a shared history e.g., repo1 can pull from (or push to) repo2 and repo3 if they have a shared history between them.

    A fork is a remote copy of a remote repo. As you know, cloning creates a local copy of a repo. In contrast, forking creates a remote copy of a repo hosted on remote service such as GitHub. This is particularly useful if you want to play around with a GitHub repo, but you don't have write permissions to it; you can simply fork the repo and do whatever you want with the fork as you are the owner of the fork.

    A pull request (PR for short) is a mechanism for contributing code to a remote repo i.e., "I'm requesting you to pull my proposed changes to your repo". It's feature provided by RCS platforms such as GitHub. For this to work, the two repos must have a shared history. The most common case is sending PRs from a fork to its repo.

    Here is a scenario that includes all the concepts introduced above (click inside the slide to advance the animation):

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Remote repositories

    Remote repositories are repos that are hosted on remote computers and allow remote access. They are especially useful for sharing the revision history of a codebase among team members of a multi-person project. They can also serve as a remote backup of your codebase.

    It is possible to set up your own remote repo on a server, but the easier option is to use a remote repo hosting service such as GitHub or BitBucket.

    You can clone a repo to create a copy of that repo in another location on your computer. The copy will even have the revision history of the original repo i.e., identical to the original repo. For example, you can clone a remote repo onto your computer to create a local copy of the remote repo.

    When you clone from a repo, the original repo is commonly referred to as the upstream repo. A repo can have multiple upstream repos. For example, let's say a repo repo1 was cloned as repo2 which was then cloned as repo3. In this case, repo1 and repo2 are upstream repos of repo3.

    You can pull (or fetch) from one repo to another, to receive new commits in the second repo, but only if the repos have a shared history. Let's say some new commits were added to the after you cloned it, and you would like to copy over those new commits to your own clone i.e., sync your clone with the upstream repo. In that case, you can pull from the upstream repo to your clone.

    You can push new commits in one repo to another repo which will copy the new commits onto the destination repo. Note that pushing to a repo requires you to have write-access to it. Furthermore, you can push between repos only if those repos have a shared history among them (i.e., one was created by copying the other at some point in the past).

    Cloning, pushing, and pulling/fetching can be done between two local repos too, although it is more common for them to involve a remote repo.

    A repo can work with any number of other repositories as long as they have a shared history e.g., repo1 can pull from (or push to) repo2 and repo3 if they have a shared history between them.

    A fork is a remote copy of a remote repo. As you know, cloning creates a local copy of a repo. In contrast, forking creates a remote copy of a repo hosted on remote service such as GitHub. This is particularly useful if you want to play around with a GitHub repo, but you don't have write permissions to it; you can simply fork the repo and do whatever you want with the fork as you are the owner of the fork.

    A pull request (PR for short) is a mechanism for contributing code to a remote repo i.e., "I'm requesting you to pull my proposed changes to your repo". It's feature provided by RCS platforms such as GitHub. For this to work, the two repos must have a shared history. The most common case is sending PRs from a fork to its repo.

    Here is a scenario that includes all the concepts introduced above (click inside the slide to advance the animation):

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/remoteRepositories/index.page-vue-render.js b/book/revisionControl/remoteRepositories/index.page-vue-render.js index f5430662df..b477814ef4 100644 --- a/book/revisionControl/remoteRepositories/index.page-vue-render.js +++ b/book/revisionControl/remoteRepositories/index.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('p',[_v("Here is a scenario that includes all the concepts with(this){return _c('div',{staticClass:"block-embed-service-powerpoint"},[_c('iframe',{attrs:{"type":"text/html","src":"https://onedrive.live.com/embed?cid=A5AF047C4CAD67AB&resid=A5AF047C4CAD67AB%212290&authkey=&em=2&action=embedview&wdAr=1.3333333333333333","frameborder":"0","width":"610","height":"481","webkitallowfullscreen":"","mozallowfullscreen":"","allowfullscreen":""}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/repositories/index.html b/book/revisionControl/repositories/index.html index 5e21a076ff..249a0790f5 100644 --- a/book/revisionControl/repositories/index.html +++ b/book/revisionControl/repositories/index.html @@ -13,7 +13,7 @@

    Can explain repositories

    Project Management → Revision Control → -

    Repositories

    The repository is the database that stores the revision history. Suppose you want to apply revision control on files in a directory called ProjectFoo. In that case, you need to set up a repo (short for repository) in the ProjectFoo directory, which is referred to as the working directory of the repo. For example, Git uses a hidden folder named .git inside the working directory, to store the database of the working directory's revision history.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    You can have multiple repos in your computer, each repo revision-controlling files of a different working directory, for examples, files of different projects.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Repositories

    The repository is the database that stores the revision history. Suppose you want to apply revision control on files in a directory called ProjectFoo. In that case, you need to set up a repo (short for repository) in the ProjectFoo directory, which is referred to as the working directory of the repo. For example, Git uses a hidden folder named .git inside the working directory, to store the database of the working directory's revision history.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    You can have multiple repos in your computer, each repo revision-controlling files of a different working directory, for examples, files of different projects.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/repositories/index.page-vue-render.js b/book/revisionControl/repositories/index.page-vue-render.js index f1b040eaff..f2abf3c8a9 100644 --- a/book/revisionControl/repositories/index.page-vue-render.js +++ b/book/revisionControl/repositories/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"repositories"}},[_c('span',[_v("Repositories")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#repositories","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/savingHistory/index.html b/book/revisionControl/savingHistory/index.html index 58afd13b24..c6d86ee9d2 100644 --- a/book/revisionControl/savingHistory/index.html +++ b/book/revisionControl/savingHistory/index.html @@ -14,7 +14,7 @@

    Can explain saving history

    Project Management → Revision Control →

    Saving history

    Tracking and ignoring

    In a repo, you can specify which files to track and which files to ignore. For example, we can configure Git to ignore temporary files created during the build/test process, as it does not make sense to track their version history.

    Staging and committing

    Committing saves a snapshot of the current state of the tracked files in the revision control history. Such a snapshot is also called a commit (i.e. the noun).

    Commit (noun): a change (aka a revision) saved in the Git revision history.
    -(verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    When ready to commit, you first add the specific changes you want to commit to a staging area. This intermediate step allows you to commit only some changes while saving other changes for a later commit.

    Stage (verb): Instructing Git to prepare a file for committing.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +(verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    When ready to commit, you first add the specific changes you want to commit to a staging area. This intermediate step allows you to commit only some changes while saving other changes for a later commit.

    Stage (verb): Instructing Git to prepare a file for committing.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/savingHistory/index.page-vue-render.js b/book/revisionControl/savingHistory/index.page-vue-render.js index 0c40787df0..71fc3f16cc 100644 --- a/book/revisionControl/savingHistory/index.page-vue-render.js +++ b/book/revisionControl/savingHistory/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("In a repo, you can specify which file with(this){return _c('h5',{attrs:{"id":"staging-and-committing"}},[_v("Staging and committing"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#staging-and-committing","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/usingHistory/index.html b/book/revisionControl/usingHistory/index.html index d498b0ab8d..011ad3482a 100644 --- a/book/revisionControl/usingHistory/index.html +++ b/book/revisionControl/usingHistory/index.html @@ -13,7 +13,7 @@

    Can explain basic concepts of how RCS history is used

    Project Management → Revision Control → -

    Using history

    RCS tools store the history of the working directory as a series of commits. This means you should commit after each change that you want the RCS to 'remember'.

    Each commit in a repo is a recorded point in the history of the project that is uniquely identified by an auto-generated hash e.g. a16043703f28e5b3dab95915f5c5e5bf4fdc5fc1.

    You can tag a specific commit with a more easily identifiable name e.g. v1.0.2.

    To see what changed between two points of the history, you can ask the RCS tool to diff the two commits in concern.

    To restore the state of the working directory at a point in the past, you can checkout the commit in concern. i.e., you can traverse the history of the working directory simply by checking out the commits you are interested in.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Using history

    RCS tools store the history of the working directory as a series of commits. This means you should commit after each change that you want the RCS to 'remember'.

    Each commit in a repo is a recorded point in the history of the project that is uniquely identified by an auto-generated hash e.g. a16043703f28e5b3dab95915f5c5e5bf4fdc5fc1.

    You can tag a specific commit with a more easily identifiable name e.g. v1.0.2.

    To see what changed between two points of the history, you can ask the RCS tool to diff the two commits in concern.

    To restore the state of the working directory at a point in the past, you can checkout the commit in concern. i.e., you can traverse the history of the working directory simply by checking out the commits you are interested in.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/usingHistory/index.page-vue-render.js b/book/revisionControl/usingHistory/index.page-vue-render.js index 08d9b83971..4c62d65fe9 100644 --- a/book/revisionControl/usingHistory/index.page-vue-render.js +++ b/book/revisionControl/usingHistory/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("To see what changed between two point with(this){return _c('p',[_c('strong',[_v("To restore the state of the working directory at a point in the past, you can "),_c('mark',[_c('em',[_v("checkout")])]),_v(" the commit in concern.")]),_v(" i.e., you can traverse the history of the working directory simply by checking out the commits you are interested in.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/revisionControl/what/index.html b/book/revisionControl/what/index.html index 793dd67a8d..09631c578d 100644 --- a/book/revisionControl/what/index.html +++ b/book/revisionControl/what/index.html @@ -13,7 +13,7 @@

    Can explain revision control

    Project Management → Revision Control → -

    What

    Given below is a general introduction to revision control, adapted from bryan-mercurial-guide:

    Revision control is the process of managing multiple versions of a piece of information. In its simplest form, this is something that many people do by hand: every time you modify a file, save it under a new name that contains a number, each one higher than the number of the preceding version.

    Manually managing multiple versions of even a single file is an error-prone task, though, so software tools to help automate this process have long been available. The earliest automated revision control tools were intended to help a single user to manage revisions of a single file. Over the past few decades, the scope of revision control tools has expanded greatly; they now manage multiple files, and help multiple people to work together. The best modern revision control tools have no problem coping with thousands of people working together on projects that consist of hundreds of thousands of files.

    There are a number of reasons why you or your team might want to use an automated revision control tool for a project.

    • It will track the history and evolution of your project, so you don't have to. For every change, you'll have a log of who made it; why they made it; when they made it; and what the change was.
    • It makes it easier for you to collaborate when you're working with other people. For example, when people more or less simultaneously make potentially incompatible changes, the software will help you to identify and resolve those conflicts.
    • It can help you to recover from mistakes. If you make a change that later turns out to be an error, you can revert to an earlier version of one or more files. In fact, a really good revision control tool will even help you to efficiently figure out exactly when a problem was introduced.
    • It will help you to work simultaneously on, and manage the drift between, multiple versions of your project.

    Most of these reasons are equally valid, at least in theory, whether you're working on a project by yourself, or with a hundred other people.



    Revision: A revision (some seem to use it interchangeably with version while others seem to distinguish the two -- here, let us treat them as the same, for simplicity) is a state of a piece of information at a specific time that is a result of some changes to it e.g., if you modify the code and save the file, you have a new revision (or a new version) of that file.

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Revision control software are also known as Version Control Software (VCS), and by a few other names.

    Git is the most widely used RCS today. Other RCS tools include Mercurial, Subversion (SVN), Perforce, CVS (Concurrent Versions System), Bazaar, TFS (Team Foundation Server), and Clearcase.

    Github is a web-based project hosting platform for projects using Git for revision control. Other similar services include GitLab, BitBucket, and SourceForge.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Given below is a general introduction to revision control, adapted from bryan-mercurial-guide:

    Revision control is the process of managing multiple versions of a piece of information. In its simplest form, this is something that many people do by hand: every time you modify a file, save it under a new name that contains a number, each one higher than the number of the preceding version.

    Manually managing multiple versions of even a single file is an error-prone task, though, so software tools to help automate this process have long been available. The earliest automated revision control tools were intended to help a single user to manage revisions of a single file. Over the past few decades, the scope of revision control tools has expanded greatly; they now manage multiple files, and help multiple people to work together. The best modern revision control tools have no problem coping with thousands of people working together on projects that consist of hundreds of thousands of files.

    There are a number of reasons why you or your team might want to use an automated revision control tool for a project.

    • It will track the history and evolution of your project, so you don't have to. For every change, you'll have a log of who made it; why they made it; when they made it; and what the change was.
    • It makes it easier for you to collaborate when you're working with other people. For example, when people more or less simultaneously make potentially incompatible changes, the software will help you to identify and resolve those conflicts.
    • It can help you to recover from mistakes. If you make a change that later turns out to be an error, you can revert to an earlier version of one or more files. In fact, a really good revision control tool will even help you to efficiently figure out exactly when a problem was introduced.
    • It will help you to work simultaneously on, and manage the drift between, multiple versions of your project.

    Most of these reasons are equally valid, at least in theory, whether you're working on a project by yourself, or with a hundred other people.



    Revision: A revision (some seem to use it interchangeably with version while others seem to distinguish the two -- here, let us treat them as the same, for simplicity) is a state of a piece of information at a specific time that is a result of some changes to it e.g., if you modify the code and save the file, you have a new revision (or a new version) of that file.

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Revision control software are also known as Version Control Software (VCS), and by a few other names.

    Git is the most widely used RCS today. Other RCS tools include Mercurial, Subversion (SVN), Perforce, CVS (Concurrent Versions System), Bazaar, TFS (Team Foundation Server), and Clearcase.

    Github is a web-based project hosting platform for projects using Git for revision control. Other similar services include GitLab, BitBucket, and SourceForge.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/revisionControl/what/index.page-vue-render.js b/book/revisionControl/what/index.page-vue-render.js index a91218e259..54b4a51c50 100644 --- a/book/revisionControl/what/index.page-vue-render.js +++ b/book/revisionControl/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_c('span',{staticClass:"large"},[_c('a',{ with(this){return _c('p',[_c('strong',[_c('span',{staticClass:"large"},[_c('a',{attrs:{"href":"https://github.com/"}},[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}}),_v(" Github")])]),_v(" is a web-based project hosting platform for projects using Git for revision control.")]),_v(" Other similar services include GitLab, BitBucket, and SourceForge.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/softwareEngineering/index.html b/book/softwareEngineering/index.html index dbdf4a980f..436914c916 100644 --- a/book/softwareEngineering/index.html +++ b/book/softwareEngineering/index.html @@ -42,7 +42,7 @@ it becomes obsolete in terms of its concepts. But implementation of real products demands phasing and quantizing. The obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts. The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.

    This then is programming, both a tar pit in which many efforts have floundered and a creative activity with joys -and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/softwareEngineering/index.page-vue-render.js b/book/softwareEngineering/index.page-vue-render.js index a573ffcd27..4a74d5a524 100644 --- a/book/softwareEngineering/index.page-vue-render.js +++ b/book/softwareEngineering/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"software-engineering"}},[_c('span',[_v("Software Engineering")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-engineering","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/softwareEngineering/introduction/index.html b/book/softwareEngineering/introduction/index.html index aaf0c65863..650678b195 100644 --- a/book/softwareEngineering/introduction/index.html +++ b/book/softwareEngineering/introduction/index.html @@ -43,7 +43,7 @@ it becomes obsolete in terms of its concepts. But implementation of real products demands phasing and quantizing. The obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts. The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.

    This then is programming, both a tar pit in which many efforts have floundered and a creative activity with joys -and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/softwareEngineering/introduction/index.page-vue-render.js b/book/softwareEngineering/introduction/index.page-vue-render.js index 5360bcf148..44f088bd7c 100644 --- a/book/softwareEngineering/introduction/index.page-vue-render.js +++ b/book/softwareEngineering/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/softwareEngineering/introduction/prosAndCons/index.html b/book/softwareEngineering/introduction/prosAndCons/index.html index 7280dbc11b..8976b6d6ca 100644 --- a/book/softwareEngineering/introduction/prosAndCons/index.html +++ b/book/softwareEngineering/introduction/prosAndCons/index.html @@ -43,7 +43,7 @@ it becomes obsolete in terms of its concepts. But implementation of real products demands phasing and quantizing. The obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts. The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.

    This then is programming, both a tar pit in which many efforts have floundered and a creative activity with joys -and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/softwareEngineering/introduction/prosAndCons/index.page-vue-render.js b/book/softwareEngineering/introduction/prosAndCons/index.page-vue-render.js index ba43fe4e98..2c4a652161 100644 --- a/book/softwareEngineering/introduction/prosAndCons/index.page-vue-render.js +++ b/book/softwareEngineering/introduction/prosAndCons/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('blockquote',[_c('p',[_c('strong',[_v("Not all is delight, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/featureList/index.html b/book/specifyingRequirements/featureList/index.html index a4ddcef8ca..3b2735c6f6 100644 --- a/book/specifyingRequirements/featureList/index.html +++ b/book/specifyingRequirements/featureList/index.html @@ -14,7 +14,7 @@

    Requirements → Specifying Requirements →

    Feature lists

    What

    Can explain feature list

    Feature list: A list of features of a product grouped according to some criteria such as aspect, priority, order of delivery, etc.

    A sample feature list from a simple Minesweeper game (only a brief description has been provided to save space):

    1. Basic play – Single player play.
    2. Difficulty levels -
      • Medium levels
      • Advanced levels
    3. Versus play – Two players can play against each other.
    4. Timer – Additional fixed time restriction on the player.
    5. ...

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Medium levels
    • Advanced levels
  • Versus play – Two players can play against each other.
  • Timer – Additional fixed time restriction on the player.
  • ...

  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/featureList/index.page-vue-render.js b/book/specifyingRequirements/featureList/index.page-vue-render.js index cd80a357c0..f743edbe66 100644 --- a/book/specifyingRequirements/featureList/index.page-vue-render.js +++ b/book/specifyingRequirements/featureList/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"feature-lists"}},[_c('span',[_v("Feature lists")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-lists","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/featureList/what/index.html b/book/specifyingRequirements/featureList/what/index.html index c5da208a0f..0e76ea597a 100644 --- a/book/specifyingRequirements/featureList/what/index.html +++ b/book/specifyingRequirements/featureList/what/index.html @@ -14,7 +14,7 @@

    Can explain feature list

    Requirements → Specifying Requirements → Feature Lists →

    What

    Feature list: A list of features of a product grouped according to some criteria such as aspect, priority, order of delivery, etc.

    A sample feature list from a simple Minesweeper game (only a brief description has been provided to save space):

    1. Basic play – Single player play.
    2. Difficulty levels -
      • Medium levels
      • Advanced levels
    3. Versus play – Two players can play against each other.
    4. Timer – Additional fixed time restriction on the player.
    5. ...
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Medium levels
    • Advanced levels
  • Versus play – Two players can play against each other.
  • Timer – Additional fixed time restriction on the player.
  • ...
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/featureList/what/index.page-vue-render.js b/book/specifyingRequirements/featureList/what/index.page-vue-render.js index d9cf12847b..0a2dc453a2 100644 --- a/book/specifyingRequirements/featureList/what/index.page-vue-render.js +++ b/book/specifyingRequirements/featureList/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/glossary/index.html b/book/specifyingRequirements/glossary/index.html index d264e771ee..0f49c42ea6 100644 --- a/book/specifyingRequirements/glossary/index.html +++ b/book/specifyingRequirements/glossary/index.html @@ -13,7 +13,7 @@

    Requirements → Specifying Requirements → -

    Glossary

    What

    Can explain glossary

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Glossary

    What

    Can explain glossary

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/glossary/index.page-vue-render.js b/book/specifyingRequirements/glossary/index.page-vue-render.js index 04e3c2088d..375a972bca 100644 --- a/book/specifyingRequirements/glossary/index.page-vue-render.js +++ b/book/specifyingRequirements/glossary/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"glossary"}},[_c('span',[_v("Glossary")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#glossary","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/glossary/what/index.html b/book/specifyingRequirements/glossary/what/index.html index c2ae3b23fe..515ca751b1 100644 --- a/book/specifyingRequirements/glossary/what/index.html +++ b/book/specifyingRequirements/glossary/what/index.html @@ -13,7 +13,7 @@

    Can explain glossary

    Requirements → Specifying Requirements → Glossary → -

    What

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/glossary/what/index.page-vue-render.js b/book/specifyingRequirements/glossary/what/index.page-vue-render.js index 8dc9def9d4..f0a39c3a4b 100644 --- a/book/specifyingRequirements/glossary/what/index.page-vue-render.js +++ b/book/specifyingRequirements/glossary/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/index.html b/book/specifyingRequirements/index.html index 68afff7626..d1e4f2d964 100644 --- a/book/specifyingRequirements/index.html +++ b/book/specifyingRequirements/index.html @@ -239,7 +239,7 @@ Use case: UC23 - Transfer Money
    Actor: User
    Preconditions: User is logged in.
    Guarantees:

    • Money will be deducted from the source account only if the transfer to the destination account is successful.
    • The transfer will not result in the account balance going below the minimum balance required.

    MSS:

    1. User chooses to transfer money.
    2. OBS requests for details for the transfer.
      -...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?



    Usage

    Can optimize the use of use cases

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases




    Glossary

    What

    Can explain glossary

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.


    Supplementary requirements

    What

    Can explain supplementary requirements

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?



    Usage

    Can optimize the use of use cases

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases




    Glossary

    What

    Can explain glossary

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.


    Supplementary requirements

    What

    Can explain supplementary requirements

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/index.page-vue-render.js b/book/specifyingRequirements/index.page-vue-render.js index 7343a40371..c66699b5e1 100644 --- a/book/specifyingRequirements/index.page-vue-render.js +++ b/book/specifyingRequirements/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"specifying-requirements"}},[_c('span',[_v("Specifying requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#specifying-requirements","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/prose/index.html b/book/specifyingRequirements/prose/index.html index a6ea9dc277..5ed2b9c023 100644 --- a/book/specifyingRequirements/prose/index.html +++ b/book/specifyingRequirements/prose/index.html @@ -13,7 +13,7 @@

    Requirements → Specifying Requirements → -

    Prose

    What

    Can explain prose

    A textual description (i.e. prose) can be used to describe requirements. Prose is especially useful when describing abstract ideas such as the vision of a product.

    The product vision of the TEAMMATES Project given below is described using prose.

    TEAMMATES aims to become the biggest student project in the world (biggest here refers to 'many contributors, many users, large codebase, evolving over a long period'). Furthermore, it aims to serve as a training tool for Software Engineering students who want to learn SE skills in the context of a non-trivial real software product.

    Avoid using lengthy prose to describe requirements; they can be hard to follow.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Prose

    What

    Can explain prose

    A textual description (i.e. prose) can be used to describe requirements. Prose is especially useful when describing abstract ideas such as the vision of a product.

    The product vision of the TEAMMATES Project given below is described using prose.

    TEAMMATES aims to become the biggest student project in the world (biggest here refers to 'many contributors, many users, large codebase, evolving over a long period'). Furthermore, it aims to serve as a training tool for Software Engineering students who want to learn SE skills in the context of a non-trivial real software product.

    Avoid using lengthy prose to describe requirements; they can be hard to follow.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/prose/index.page-vue-render.js b/book/specifyingRequirements/prose/index.page-vue-render.js index 8fb84bc176..119a5e4413 100644 --- a/book/specifyingRequirements/prose/index.page-vue-render.js +++ b/book/specifyingRequirements/prose/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"prose"}},[_c('span',[_v("Prose")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#prose","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/prose/what/index.html b/book/specifyingRequirements/prose/what/index.html index d2cb795450..7d8bb2d743 100644 --- a/book/specifyingRequirements/prose/what/index.html +++ b/book/specifyingRequirements/prose/what/index.html @@ -13,7 +13,7 @@

    Can explain prose

    Requirements → Specifying Requirements → Prose → -

    What

    A textual description (i.e. prose) can be used to describe requirements. Prose is especially useful when describing abstract ideas such as the vision of a product.

    The product vision of the TEAMMATES Project given below is described using prose.

    TEAMMATES aims to become the biggest student project in the world (biggest here refers to 'many contributors, many users, large codebase, evolving over a long period'). Furthermore, it aims to serve as a training tool for Software Engineering students who want to learn SE skills in the context of a non-trivial real software product.

    Avoid using lengthy prose to describe requirements; they can be hard to follow.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    A textual description (i.e. prose) can be used to describe requirements. Prose is especially useful when describing abstract ideas such as the vision of a product.

    The product vision of the TEAMMATES Project given below is described using prose.

    TEAMMATES aims to become the biggest student project in the world (biggest here refers to 'many contributors, many users, large codebase, evolving over a long period'). Furthermore, it aims to serve as a training tool for Software Engineering students who want to learn SE skills in the context of a non-trivial real software product.

    Avoid using lengthy prose to describe requirements; they can be hard to follow.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/prose/what/index.page-vue-render.js b/book/specifyingRequirements/prose/what/index.page-vue-render.js index b1bf1f21f7..9fc7875dac 100644 --- a/book/specifyingRequirements/prose/what/index.page-vue-render.js +++ b/book/specifyingRequirements/prose/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("A textual description (i.e. "),_c('em',[_v("prose")]),_v(") can be used to describe requirements.")]),_v(" Prose is especially useful when describing abstract ideas such as the vision of a product.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/supplementaryRequirements/index.html b/book/specifyingRequirements/supplementaryRequirements/index.html index 34b4209707..ab16c04cf8 100644 --- a/book/specifyingRequirements/supplementaryRequirements/index.html +++ b/book/specifyingRequirements/supplementaryRequirements/index.html @@ -13,7 +13,7 @@ +

    Supplementary requirements

    What

    Can explain supplementary requirements

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/supplementaryRequirements/index.page-vue-render.js b/book/specifyingRequirements/supplementaryRequirements/index.page-vue-render.js index 4126c78242..a193ed61a9 100644 --- a/book/specifyingRequirements/supplementaryRequirements/index.page-vue-render.js +++ b/book/specifyingRequirements/supplementaryRequirements/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"supplementary-requirements"}},[_c('span',[_v("Supplementary requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#supplementary-requirements","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/supplementaryRequirements/what/index.html b/book/specifyingRequirements/supplementaryRequirements/what/index.html index 0b3f3d8d58..6ef4306b93 100644 --- a/book/specifyingRequirements/supplementaryRequirements/what/index.html +++ b/book/specifyingRequirements/supplementaryRequirements/what/index.html @@ -13,7 +13,7 @@ +

    What

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/supplementaryRequirements/what/index.page-vue-render.js b/book/specifyingRequirements/supplementaryRequirements/what/index.page-vue-render.js index 643e4757b4..065068915b 100644 --- a/book/specifyingRequirements/supplementaryRequirements/what/index.page-vue-render.js +++ b/book/specifyingRequirements/supplementaryRequirements/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('strong',[_v("A "),_c('em',[_v("supplementary requirements")]),_v(" section can be used to capture "),_c('em',[_v("requirements that do not fit elsewhere")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/useCases/details/index.html b/book/specifyingRequirements/useCases/details/index.html index cb3db585ad..09f1886174 100644 --- a/book/specifyingRequirements/useCases/details/index.html +++ b/book/specifyingRequirements/useCases/details/index.html @@ -131,7 +131,7 @@ Use case: UC23 - Transfer Money
    Actor: User
    Preconditions: User is logged in.
    Guarantees:

    • Money will be deducted from the source account only if the transfer to the destination account is successful.
    • The transfer will not result in the account balance going below the minimum balance required.

    MSS:

    1. User chooses to transfer money.
    2. OBS requests for details for the transfer.
      -...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/useCases/details/index.page-vue-render.js b/book/specifyingRequirements/useCases/details/index.page-vue-render.js index 92ac1f120b..b8c73a0f15 100644 --- a/book/specifyingRequirements/useCases/details/index.page-vue-render.js +++ b/book/specifyingRequirements/useCases/details/index.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('p',[_c('strong',[_c('mark',[_c('em',[_v("Guarantees")])]), with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/useCases/identifying/index.html b/book/specifyingRequirements/useCases/identifying/index.html index b5034abbc0..cac687fbc2 100644 --- a/book/specifyingRequirements/useCases/identifying/index.html +++ b/book/specifyingRequirements/useCases/identifying/index.html @@ -16,7 +16,7 @@

    Identifying

    A use case is an interaction between a system and its actors.

    Actors in Use Cases

    Actor: An actor (in a use case) is a role played by a user. An actor can be a human or another system. Actors are not part of the system; they reside outside the system.

    Some example actors for a Learning Management System:

    • Actors: Guest, Student, Staff, Admin, , .

    A use case can involve multiple actors.

    • Software System: LearnSys
    • Use case: UC01 Conduct Survey
    • Actors: Staff, Student

    An actor can be involved in many use cases.

    • Software System: LearnSys
    • Actor: Staff
    • Use cases: UC01 Conduct Survey, UC02 Set Up Course Schedule, UC03 Email Class, ...

    A single person/system can play many roles.

    • Software System: LearnSys
    • Person: a student
    • Actors (or Roles): Student, Guest, Tutor

    Many persons/systems can play a single role.

    • Software System: LearnSys
    • Actor (or role): Student
    • Persons that can play this role: undergraduate student, graduate student, a staff member doing a part-time course, exchange student

    Use cases can be specified at various levels of detail.

    Consider the three use cases given below. Clearly, (a) is at a higher level than (b) and (b) is at a higher level than (c).

    • System: LearnSys
    • Use cases:
      a. Conduct a survey
      b. Take the survey
      -c. Answer survey question

    While modeling user-system interactions,

    • start with high level use cases and progressively work toward lower level use cases.
    • be mindful of which level of detail you are working at and not to mix use cases of different levels.

    Exercises:

    Use case diagram for a ticket vending machine


    Use case diagram for QA system


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +c. Answer survey question

    While modeling user-system interactions,

    • start with high level use cases and progressively work toward lower level use cases.
    • be mindful of which level of detail you are working at and not to mix use cases of different levels.

    Exercises:

    Use case diagram for a ticket vending machine


    Use case diagram for QA system


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/useCases/identifying/index.page-vue-render.js b/book/specifyingRequirements/useCases/identifying/index.page-vue-render.js index 7b3a43f4ab..572b2fc12f 100644 --- a/book/specifyingRequirements/useCases/identifying/index.page-vue-render.js +++ b/book/specifyingRequirements/useCases/identifying/index.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('ul',[_c('li',[_v("start with high level use cases and prog with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/useCases/index.html b/book/specifyingRequirements/useCases/index.html index 841c06f16e..a520ed7f18 100644 --- a/book/specifyingRequirements/useCases/index.html +++ b/book/specifyingRequirements/useCases/index.html @@ -231,7 +231,7 @@ Use case: UC23 - Transfer Money
    Actor: User
    Preconditions: User is logged in.
    Guarantees:

    • Money will be deducted from the source account only if the transfer to the destination account is successful.
    • The transfer will not result in the account balance going below the minimum balance required.

    MSS:

    1. User chooses to transfer money.
    2. OBS requests for details for the transfer.
      -...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?



    Usage

    Can optimize the use of use cases

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?



    Usage

    Can optimize the use of use cases

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/useCases/index.page-vue-render.js b/book/specifyingRequirements/useCases/index.page-vue-render.js index 5238e6302c..ce2e10f0f3 100644 --- a/book/specifyingRequirements/useCases/index.page-vue-render.js +++ b/book/specifyingRequirements/useCases/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"use-cases"}},[_c('span',[_v("Use cases")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#use-cases","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/useCases/introduction/index.html b/book/specifyingRequirements/useCases/introduction/index.html index 9d0e24f36a..0a32278c05 100644 --- a/book/specifyingRequirements/useCases/introduction/index.html +++ b/book/specifyingRequirements/useCases/introduction/index.html @@ -110,7 +110,7 @@ -

    Example 2: 'upload file' use case of an LMS


    UML includes a diagram type called use case diagrams that can illustrate use cases of a system visually, providing a visual ‘table of contents’ of the use cases of a system.

    In the example on the right, note how use cases are shown as ovals and user roles relevant to each use case are shown as stick figures connected to the corresponding ovals.

    Use cases capture the functional requirements of a system.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Example 2: 'upload file' use case of an LMS


    UML includes a diagram type called use case diagrams that can illustrate use cases of a system visually, providing a visual ‘table of contents’ of the use cases of a system.

    In the example on the right, note how use cases are shown as ovals and user roles relevant to each use case are shown as stick figures connected to the corresponding ovals.

    Use cases capture the functional requirements of a system.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/useCases/introduction/index.page-vue-render.js b/book/specifyingRequirements/useCases/introduction/index.page-vue-render.js index e1bc7e66a0..30de92375c 100644 --- a/book/specifyingRequirements/useCases/introduction/index.page-vue-render.js +++ b/book/specifyingRequirements/useCases/introduction/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("A use case describes an "),_c('em',[_ with(this){return _c('p',[_c('strong',[_v("Use cases capture the "),_c('em',[_v("functional requirements")]),_v(" of a system.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/useCases/usage/index.html b/book/specifyingRequirements/useCases/usage/index.html index f023f6850c..77441dec84 100644 --- a/book/specifyingRequirements/useCases/usage/index.html +++ b/book/specifyingRequirements/useCases/usage/index.html @@ -13,7 +13,7 @@

    Can optimize the use of use cases

    Requirements → Specifying Requirements → Use Cases → -

    Usage

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Usage

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/useCases/usage/index.page-vue-render.js b/book/specifyingRequirements/useCases/usage/index.page-vue-render.js index f95556be00..fd533aa289 100644 --- a/book/specifyingRequirements/useCases/usage/index.page-vue-render.js +++ b/book/specifyingRequirements/useCases/usage/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_c('strong',[_v("One of the main disadvantages of use with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/userStories/details/index.html b/book/specifyingRequirements/userStories/details/index.html index 595d804ade..98abdb55a3 100644 --- a/book/specifyingRequirements/userStories/details/index.html +++ b/book/specifyingRequirements/userStories/details/index.html @@ -16,7 +16,7 @@

    Details

    The {benefit} can be omitted if it is obvious.

    As a user, I can login to the system so that I can access my data

    It is recommended to confirm there is a concrete benefit even if you omit it from the user story. If not, you could end up adding features that have no real benefit.

    You can add more characteristics to the {user role} to provide more context to the user story.

    • As a forgetful user, I can view a password hint, so that I can recall my password.
    • As an expert user, I can tweak the underlying formatting tags of the document, so that I can format the document exactly as I need.

    You can write user stories at various levels. High-level user stories, called epics (or themes) cover bigger functionality. You can then break down these epics to multiple user stories of normal size.

    [Epic] As a lecturer, I can monitor student participation levels

    • As a lecturer, I can view the forum post count of each student
      so that I can identify the activity level of students in the forum
    • As a lecturer, I can view webcast view records of each student
      so that I can identify the students who did not view webcasts
    • As a lecturer, I can view file download statistics of each student
      -so that I can identify the students who did not download lecture materials

    You can add conditions of satisfaction to a user story to specify things that need to be true for the user story implementation to be accepted as ‘done’.

    As a lecturer, I can view the forum post count of each student so that I can identify the activity level of students in the forum.

    Conditions:

    Separate post count for each forum should be shown
    Total post count of a student should be shown
    The list should be sortable by student name and post count

    Other useful info that can be added to a user story includes (but not limited to)

    • Priority: how important the user story is
    • Size: the estimated effort to implement the user story
    • Urgency: how soon the feature is needed

    Exercises:

    Correct statements about user stories


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +so that I can identify the students who did not download lecture materials

    You can add conditions of satisfaction to a user story to specify things that need to be true for the user story implementation to be accepted as ‘done’.

    As a lecturer, I can view the forum post count of each student so that I can identify the activity level of students in the forum.

    Conditions:

    Separate post count for each forum should be shown
    Total post count of a student should be shown
    The list should be sortable by student name and post count

    Other useful info that can be added to a user story includes (but not limited to)

    • Priority: how important the user story is
    • Size: the estimated effort to implement the user story
    • Urgency: how soon the feature is needed

    Exercises:

    Correct statements about user stories


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/userStories/details/index.page-vue-render.js b/book/specifyingRequirements/userStories/details/index.page-vue-render.js index 9546a3f9ad..7748db7e7d 100644 --- a/book/specifyingRequirements/userStories/details/index.page-vue-render.js +++ b/book/specifyingRequirements/userStories/details/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('ul',[_c('li',[_v("Priority: how important the user story i with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/userStories/index.html b/book/specifyingRequirements/userStories/index.html index 994bb494c1..9a48da641b 100644 --- a/book/specifyingRequirements/userStories/index.html +++ b/book/specifyingRequirements/userStories/index.html @@ -21,7 +21,7 @@ For example, consider this user story: As a user, I want to see a list of tasks that need my attention most at the present time, so that I pay attention to them first.
    When discussing this user story, don't worry about what tasks should be considered 'needs my attention most at the present time'. Those details can be worked out later.
  • Don't be biased by preconceived product ideas: When you are at the stage of identifying user needs, clear your mind of ideas you have about what your end product will look like. That is, don't try to reverse-engineer a preconceived product idea into user stories.
  • Don't discuss implementation details or whether you are actually going to implement it: -When gathering requirements, your decision is whether the user's need is important enough for you to want to fulfil it. Implementation details can be discussed later. If a user story turns out to be too difficult to implement later, you can always omit it from the implementation plan.
  • While use cases can be recorded on in the initial stages, an online tool is more suitable for longer-term management of user stories, especially if the team is not .

    Tool Examples: How to use some example online tools to manage user stories



    Resources:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +When gathering requirements, your decision is whether the user's need is important enough for you to want to fulfil it. Implementation details can be discussed later. If a user story turns out to be too difficult to implement later, you can always omit it from the implementation plan.

    While use cases can be recorded on in the initial stages, an online tool is more suitable for longer-term management of user stories, especially if the team is not .

    Tool Examples: How to use some example online tools to manage user stories



    Resources:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/userStories/index.page-vue-render.js b/book/specifyingRequirements/userStories/index.page-vue-render.js index a64e265c00..d476603e89 100644 --- a/book/specifyingRequirements/userStories/index.page-vue-render.js +++ b/book/specifyingRequirements/userStories/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"user-stories"}},[_c('span',[_v("User stories")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#user-stories","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/userStories/introduction/index.html b/book/specifyingRequirements/userStories/introduction/index.html index b0948e3a89..a21cb2de44 100644 --- a/book/specifyingRequirements/userStories/introduction/index.html +++ b/book/specifyingRequirements/userStories/introduction/index.html @@ -13,7 +13,7 @@

    Can write simple user stories

    Requirements → Specifying Requirements → User Stories → -

    Introduction

    User story: User stories are short, simple descriptions of a feature told from the perspective of the person who desires the new capability, usually a user or customer of the system. [Mike Cohn]

    A common format for writing user stories is:

    User story format: As a {user type/role} I can {function} so that {benefit}

    Examples (from a Learning Management System):

    1. As a student, I can download files uploaded by lecturers, so that I can get my own copy of the files
    2. As a lecturer, I can create discussion forums, so that students can discuss things online
    3. As a tutor, I can print attendance sheets, so that I can take attendance during the class

    You can write user stories using a physical medium or a digital tool. For example, you can use index cards or sticky notes, and arrange them on walls or tables. Alternatively, you can use a software (e.g., GitHub Project Boards, Trello, Google Docs, ...) to manage user stories digitally.


    Exercises:

    Which of these are true about user stories?


    What's wrong with this user story?


    Extract user stories from customer statement


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    User story: User stories are short, simple descriptions of a feature told from the perspective of the person who desires the new capability, usually a user or customer of the system. [Mike Cohn]

    A common format for writing user stories is:

    User story format: As a {user type/role} I can {function} so that {benefit}

    Examples (from a Learning Management System):

    1. As a student, I can download files uploaded by lecturers, so that I can get my own copy of the files
    2. As a lecturer, I can create discussion forums, so that students can discuss things online
    3. As a tutor, I can print attendance sheets, so that I can take attendance during the class

    You can write user stories using a physical medium or a digital tool. For example, you can use index cards or sticky notes, and arrange them on walls or tables. Alternatively, you can use a software (e.g., GitHub Project Boards, Trello, Google Docs, ...) to manage user stories digitally.


    Exercises:

    Which of these are true about user stories?


    What's wrong with this user story?


    Extract user stories from customer statement


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/userStories/introduction/index.page-vue-render.js b/book/specifyingRequirements/userStories/introduction/index.page-vue-render.js index a4c631a86a..170ca8ef10 100644 --- a/book/specifyingRequirements/userStories/introduction/index.page-vue-render.js +++ b/book/specifyingRequirements/userStories/introduction/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("You can write user stories using a ph with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/specifyingRequirements/userStories/usage/index.html b/book/specifyingRequirements/userStories/usage/index.html index d2aa10d167..6d2b93fc9f 100644 --- a/book/specifyingRequirements/userStories/usage/index.html +++ b/book/specifyingRequirements/userStories/usage/index.html @@ -18,7 +18,7 @@ For example, consider this user story: As a user, I want to see a list of tasks that need my attention most at the present time, so that I pay attention to them first.
    When discussing this user story, don't worry about what tasks should be considered 'needs my attention most at the present time'. Those details can be worked out later.
  • Don't be biased by preconceived product ideas: When you are at the stage of identifying user needs, clear your mind of ideas you have about what your end product will look like. That is, don't try to reverse-engineer a preconceived product idea into user stories.
  • Don't discuss implementation details or whether you are actually going to implement it: -When gathering requirements, your decision is whether the user's need is important enough for you to want to fulfil it. Implementation details can be discussed later. If a user story turns out to be too difficult to implement later, you can always omit it from the implementation plan.
  • While use cases can be recorded on in the initial stages, an online tool is more suitable for longer-term management of user stories, especially if the team is not .

    Tool Examples: How to use some example online tools to manage user stories



    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +When gathering requirements, your decision is whether the user's need is important enough for you to want to fulfil it. Implementation details can be discussed later. If a user story turns out to be too difficult to implement later, you can always omit it from the implementation plan.

    While use cases can be recorded on in the initial stages, an online tool is more suitable for longer-term management of user stories, especially if the team is not .

    Tool Examples: How to use some example online tools to manage user stories



    Resources:
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/specifyingRequirements/userStories/usage/index.page-vue-render.js b/book/specifyingRequirements/userStories/usage/index.page-vue-render.js index ef8b277f17..fb40d4967e 100644 --- a/book/specifyingRequirements/userStories/usage/index.page-vue-render.js +++ b/book/specifyingRequirements/userStories/usage/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_v("Given their lightweight nature, "),_c('strong',[_v with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.mountaingoatsoftware.com/blog/non-functional-requirements-as-user-stories"}},[_v("This article by Mike Cohn")]),_v(" from MountainGoatSoftware explains how to use user stories to capture NFRs.")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/teamwork/index.html b/book/teamwork/index.html index 3f300b84eb..8052ecce05 100644 --- a/book/teamwork/index.html +++ b/book/teamwork/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Teamwork

    Team structures

    Can explain common team structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.


    Exercises:

    Which team structure is the most suitable for a school project?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Teamwork

    Team structures

    Can explain common team structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.


    Exercises:

    Which team structure is the most suitable for a school project?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/teamwork/index.page-vue-render.js b/book/teamwork/index.page-vue-render.js index c0ac965c1a..bdf2999acf 100644 --- a/book/teamwork/index.page-vue-render.js +++ b/book/teamwork/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"teamwork"}},[_c('span',[_v("Teamwork")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teamwork","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/teamwork/teamStructures/index.html b/book/teamwork/teamStructures/index.html index fd4de8ee5e..b1299ce063 100644 --- a/book/teamwork/teamStructures/index.html +++ b/book/teamwork/teamStructures/index.html @@ -13,7 +13,7 @@

    Can explain common team structures

    Project Management → Teamwork → -

    Team structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.


    Exercises:

    Which team structure is the most suitable for a school project?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Team structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.


    Exercises:

    Which team structure is the most suitable for a school project?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/teamwork/teamStructures/index.page-vue-render.js b/book/teamwork/teamStructures/index.page-vue-render.js index e9c3e334f5..29b279d170 100644 --- a/book/teamwork/teamStructures/index.page-vue-render.js +++ b/book/teamwork/teamStructures/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_v("At the opposite extreme of an egoless team, a stri with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/boundaryValueAnalysis/how/index.html b/book/testCaseDesign/boundaryValueAnalysis/how/index.html index d84cc10f87..a240e59d7a 100644 --- a/book/testCaseDesign/boundaryValueAnalysis/how/index.html +++ b/book/testCaseDesign/boundaryValueAnalysis/how/index.html @@ -17,7 +17,7 @@ [“F”]
    [“A”, “D”, “X”]

    No specific boundary
    No specific boundary
    -No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/boundaryValueAnalysis/how/index.page-vue-render.js b/book/testCaseDesign/boundaryValueAnalysis/how/index.page-vue-render.js index 281683d79a..30416547bd 100644 --- a/book/testCaseDesign/boundaryValueAnalysis/how/index.page-vue-render.js +++ b/book/testCaseDesign/boundaryValueAnalysis/how/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]) with(this){return _c('p',[_c('strong',[_v("Typically, you should choose three values around the boundary to test: one value from the boundary, one value just below the boundary, and one value just above the boundary.")]),_v(" The number of values to pick depends on other factors, such as the cost of each test case.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/boundaryValueAnalysis/index.html b/book/testCaseDesign/boundaryValueAnalysis/index.html index 9d3534e8ff..a8cfcbe2c7 100644 --- a/book/testCaseDesign/boundaryValueAnalysis/index.html +++ b/book/testCaseDesign/boundaryValueAnalysis/index.html @@ -17,7 +17,7 @@ [“F”]
    [“A”, “D”, “X”]

    No specific boundary
    No specific boundary
    -No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/boundaryValueAnalysis/index.page-vue-render.js b/book/testCaseDesign/boundaryValueAnalysis/index.page-vue-render.js index 304dc1fa8b..a19ce0c637 100644 --- a/book/testCaseDesign/boundaryValueAnalysis/index.page-vue-render.js +++ b/book/testCaseDesign/boundaryValueAnalysis/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"boundary-value-analysis"}},[_c('span',[_v("Boundary value analysis")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#boundary-value-analysis","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/boundaryValueAnalysis/what/index.html b/book/testCaseDesign/boundaryValueAnalysis/what/index.html index 0e80da5a9c..b5109a9e0a 100644 --- a/book/testCaseDesign/boundaryValueAnalysis/what/index.html +++ b/book/testCaseDesign/boundaryValueAnalysis/what/index.html @@ -13,7 +13,7 @@

    Can explain boundary value analysis

    Quality Assurance → Test Case Design → Boundary Value Analysis → -

    What

    Boundary Value Analysis (BVA) is a test case design heuristic that is based on the observation that bugs often result from incorrect handling of boundaries of equivalence partitions. This is not surprising, as the end points of boundaries are often used in branching instructions, etc., where the programmer can make mistakes.

    The markCellAt(int x, int y) operation could contain code such as if (x > 0 && x <= (W-1)) which involves the boundaries of x’s equivalence partitions.

    BVA suggests that when picking test inputs from an equivalence partition, values near boundaries (i.e. boundary values) are more likely to find bugs.

    Boundary values are sometimes called corner cases.


    Exercises:

    What BVA recommends


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Boundary Value Analysis (BVA) is a test case design heuristic that is based on the observation that bugs often result from incorrect handling of boundaries of equivalence partitions. This is not surprising, as the end points of boundaries are often used in branching instructions, etc., where the programmer can make mistakes.

    The markCellAt(int x, int y) operation could contain code such as if (x > 0 && x <= (W-1)) which involves the boundaries of x’s equivalence partitions.

    BVA suggests that when picking test inputs from an equivalence partition, values near boundaries (i.e. boundary values) are more likely to find bugs.

    Boundary values are sometimes called corner cases.


    Exercises:

    What BVA recommends


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/boundaryValueAnalysis/what/index.page-vue-render.js b/book/testCaseDesign/boundaryValueAnalysis/what/index.page-vue-render.js index 4775ae9514..87f5ca0d1c 100644 --- a/book/testCaseDesign/boundaryValueAnalysis/what/index.page-vue-render.js +++ b/book/testCaseDesign/boundaryValueAnalysis/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_v("Boundary values are sometimes called "),_c('em',[_ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.html b/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.html index 54b0a04ba1..95be1f7c10 100644 --- a/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.html +++ b/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.html @@ -13,7 +13,7 @@

    Can explain some basic test input combination strategies

    Quality Assurance → Test Case Design → Combining Test Inputs → -

    Test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.page-vue-render.js b/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.page-vue-render.js index 99bd625764..9696dba6b4 100644 --- a/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.page-vue-render.js +++ b/book/testCaseDesign/combiningTestInputs/combinationStrategies/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("The "),_c('em',[_v("random")]),_v(" s with(this){return _c('p',[_c('strong',[_v("There are other strategies that can be used too.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.html b/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.html index ed93399cd8..f97bbc44fa 100644 --- a/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.html +++ b/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.html @@ -13,7 +13,7 @@

    Can apply heuristic ‘test invalid inputs individually before combining them’

    Quality Assurance → Test Case Design → Combining Test Inputs → -

    Heuristic: Test invalid inputs individually before combining them

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Heuristic: Test invalid inputs individually before combining them

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.page-vue-render.js b/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.page-vue-render.js index aef0c4efee..30f02548a1 100644 --- a/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.page-vue-render.js +++ b/book/testCaseDesign/combiningTestInputs/heuristicInvalid/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Test invalid inputs individu with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/combiningTestInputs/heuristicValid/index.html b/book/testCaseDesign/combiningTestInputs/heuristicValid/index.html index be5ef6ee6e..45439a6a10 100644 --- a/book/testCaseDesign/combiningTestInputs/heuristicValid/index.html +++ b/book/testCaseDesign/combiningTestInputs/heuristicValid/index.html @@ -13,7 +13,7 @@

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Quality Assurance → Test Case Design → Combining Test Inputs → -

    Heuristic: Each valid input at least once in a positive test case

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Heuristic: Each valid input at least once in a positive test case

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/combiningTestInputs/heuristicValid/index.page-vue-render.js b/book/testCaseDesign/combiningTestInputs/heuristicValid/index.page-vue-render.js index 51e7d53b10..f217abe750 100644 --- a/book/testCaseDesign/combiningTestInputs/heuristicValid/index.page-vue-render.js +++ b/book/testCaseDesign/combiningTestInputs/heuristicValid/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_v("Answer: No.")]),_v(" "),_c('li',[_v("Rea with(this){return _c('p',[_v("In this case, a useful heuristic to apply is "),_c('strong',[_v("each valid input must appear at least once in a positive test case")]),_v(". "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Cherry")]),_v(" is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/combiningTestInputs/index.html b/book/testCaseDesign/combiningTestInputs/index.html index d37fd5ed8c..13581cda9b 100644 --- a/book/testCaseDesign/combiningTestInputs/index.html +++ b/book/testCaseDesign/combiningTestInputs/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Test Case Design → -

    Combining test inputs

    Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    Test input combination strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    Heuristic: Each valid input at least once in a positive test case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    Heuristic: Test invalid inputs individually before combining them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Combining test inputs

    Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    Test input combination strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    Heuristic: Each valid input at least once in a positive test case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    Heuristic: Test invalid inputs individually before combining them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/combiningTestInputs/index.page-vue-render.js b/book/testCaseDesign/combiningTestInputs/index.page-vue-render.js index 11548dbe11..9afdb80fa5 100644 --- a/book/testCaseDesign/combiningTestInputs/index.page-vue-render.js +++ b/book/testCaseDesign/combiningTestInputs/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"combining-test-inputs"}},[_c('span',[_v("Combining test inputs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#combining-test-inputs","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/combiningTestInputs/mix/index.html b/book/testCaseDesign/combiningTestInputs/mix/index.html index d5ad64b788..6ec21280e3 100644 --- a/book/testCaseDesign/combiningTestInputs/mix/index.html +++ b/book/testCaseDesign/combiningTestInputs/mix/index.html @@ -13,7 +13,7 @@

    Can apply multiple test input combination techniques together

    Quality Assurance → Test Case Design → Combining Test Inputs → -

    Mix

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Mix

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/combiningTestInputs/mix/index.page-vue-render.js b/book/testCaseDesign/combiningTestInputs/mix/index.page-vue-render.js index 99c470d6f7..8c3b780c8e 100644 --- a/book/testCaseDesign/combiningTestInputs/mix/index.page-vue-render.js +++ b/book/testCaseDesign/combiningTestInputs/mix/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_v("Next, you can assume that there is a dependency be with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/combiningTestInputs/why/index.html b/book/testCaseDesign/combiningTestInputs/why/index.html index c084ad2a81..045c86b1c1 100644 --- a/book/testCaseDesign/combiningTestInputs/why/index.html +++ b/book/testCaseDesign/combiningTestInputs/why/index.html @@ -13,7 +13,7 @@

    Can explain the need for strategies to combine test inputs

    Quality Assurance → Test Case Design → Combining Test Inputs → -

    Why

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Why

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/combiningTestInputs/why/index.page-vue-render.js b/book/testCaseDesign/combiningTestInputs/why/index.page-vue-render.js index 1ffcadf0a8..7d6997b8d7 100644 --- a/book/testCaseDesign/combiningTestInputs/why/index.page-vue-render.js +++ b/book/testCaseDesign/combiningTestInputs/why/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("An SUT can take multiple inputs.")]), with(this){return _c('p',[_c('strong',[_v("Testing all possible combinations is effective but not efficient.")]),_v(" If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, "),_c('strong',[_v("you need smarter ways to combine test inputs that are both effective and efficient.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/equivalencePartitions/basic/index.html b/book/testCaseDesign/equivalencePartitions/basic/index.html index bdffba18cf..ae0f79f6d4 100644 --- a/book/testCaseDesign/equivalencePartitions/basic/index.html +++ b/book/testCaseDesign/equivalencePartitions/basic/index.html @@ -16,7 +16,7 @@

    Basic

    Equivalence partitions (EPs) are usually derived from the specifications of the SUT.

    These could be EPs for the isValidMonth example:

    • [MIN_INT ... 0]: below the range that produces true (produces false)
    • [1 … 12]: the range that produces true
    • [13 … MAX_INT]: above the range that produces true (produces false)

    When the SUT has multiple inputs, you should identify EPs for each input.

    Consider the method duplicate(String s, int n): String which returns a String that contains s repeated n times.

    Example EPs for s:

    • zero-length strings
    • string containing whitespaces
    • ...

    Example EPs for n:

    • 0
    • negative values
    • ...

    An EP may not have adjacent values.

    Consider the method isPrime(int i): boolean that returns true if i is a prime number.

    EPs for i:

    • prime numbers
    • non-prime numbers

    Some inputs have only a small number of possible values and a potentially unique behavior for each value. In those cases, you have to consider each value as a partition by itself.

    Consider the method showStatusMessage(GameStatus s): String that returns a unique String for each of the possible values of s (GameStatus is an enum). In this case, each possible value of s will have to be considered as a partition.

    Note that the EP technique is merely a heuristic and not an exact science, especially when applied manually (as opposed to using an automated program analysis tool to derive EPs). The partitions derived depend on how one ‘speculates’ the SUT to behave internally. Applying EP under a glass-box or gray-box approach can yield more precise partitions.

    Consider the EPs given above for the method isValidMonth. A different tester might use these EPs instead:

    • [1 … 12]: the range that produces true
    • [all other integers]: the range that produces false

    Some more examples:

    Specification Equivalence partitions

    isValidFlag(String s): boolean
    Returns true if s is one of ["F", "T", "D"]. The comparison is case-sensitive.

    ["F"] ["T"] ["D"] ["f", "t", "d"] [any other string][null]

    squareRoot(String s): int
    Pre-conditions: s is a String that represents a positive integer e.g., "23".
    -Returns the square root of s if the square root is an integer; returns 0 otherwise.

    [s does not represent a valid number] [s is a negative integer] [s has an integer square root] [s does not have an integer square root]


    Exercises:

    EPs for isValidName method


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Returns the square root of s if the square root is an integer; returns 0 otherwise.

    [s does not represent a valid number] [s is a negative integer] [s has an integer square root] [s does not have an integer square root]


    Exercises:

    EPs for isValidName method


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/equivalencePartitions/basic/index.page-vue-render.js b/book/testCaseDesign/equivalencePartitions/basic/index.page-vue-render.js index cf242b831c..96fc9bb8d9 100644 --- a/book/testCaseDesign/equivalencePartitions/basic/index.page-vue-render.js +++ b/book/testCaseDesign/equivalencePartitions/basic/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Equivalence partitions (EPs) are usua with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/equivalencePartitions/index.html b/book/testCaseDesign/equivalencePartitions/index.html index 7c3a6cec71..fabd52401e 100644 --- a/book/testCaseDesign/equivalencePartitions/index.html +++ b/book/testCaseDesign/equivalencePartitions/index.html @@ -19,7 +19,7 @@ Pre-conditions: s is a String that represents a positive integer e.g., "23".
    Returns the square root of s if the square root is an integer; returns 0 otherwise.

    [s does not represent a valid number] [s is a negative integer] [s has an integer square root] [s does not have an integer square root]


    Exercises:

    EPs for isValidName method



    Intermediate

    Can apply EP for OOP methods

    When deciding EPs of OOP methods, you need to identify the EPs of all data participants that can potentially influence the behaviour of the method, such as,

    • the target object of the method call
    • input parameters of the method call
    • other data/objects accessed by the method such as global variables. This category may not be applicable if using the black box approach (because the test case designer using the black box approach will not know how the method is implemented).

    Consider this method in the DataStack class: push(Object o): boolean

    • Adds o to the top of the stack if the stack is not full.
    • Returns true if the push operation was a success.
    • Throws -
      • MutabilityException if the global flag FREEZE==true.
      • InvalidValueException if o is null.

    EPs:

    • DataStack object: [full] [not full]
    • o: [null] [not null]
    • FREEZE: [true][false]

    Consider a simple Minesweeper app. What are the EPs for the newGame() method of the Logic component?

    As newGame() does not have any parameters, the only obvious participant is the Logic object itself.

    Note that if the glass-box or the grey-box approach is used, other associated objects that are involved in the method might also be included as participants. For example, the Minefield object can be considered as another participant of the newGame() method. Here, the black-box approach is assumed.

    Next, let us identify equivalence partitions for each participant. Will the newGame() method behave differently for different Logic objects? If yes, how will it differ? In this case, yes, it might behave differently based on the game state. Therefore, the equivalence partitions are:

    • PRE_GAME: before the game starts, minefield does not exist yet
    • READY: a new minefield has been created and the app is waiting for the player’s first move
    • IN_PLAY: the current minefield is already in use
    • WON, LOST: let us assume that newGame() behaves the same way for these two values

    Consider the Logic component of the Minesweeper application. What are the EPs for the markCellAt(int x, int y) method? The partitions in bold represent valid inputs.

    • Logic: PRE_GAME, READY, IN_PLAY, WON, LOST
    • x: [MIN_INT..-1] [0..(W-1)] [W..MAX_INT] (assuming a minefield size of WxH)
    • y: [MIN_INT..-1] [0..(H-1)] [H..MAX_INT]
    • Cell at (x,y): HIDDEN, MARKED, CLEARED

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • MutabilityException if the global flag FREEZE==true.
    • InvalidValueException if o is null.

    EPs:

    • DataStack object: [full] [not full]
    • o: [null] [not null]
    • FREEZE: [true][false]

    Consider a simple Minesweeper app. What are the EPs for the newGame() method of the Logic component?

    As newGame() does not have any parameters, the only obvious participant is the Logic object itself.

    Note that if the glass-box or the grey-box approach is used, other associated objects that are involved in the method might also be included as participants. For example, the Minefield object can be considered as another participant of the newGame() method. Here, the black-box approach is assumed.

    Next, let us identify equivalence partitions for each participant. Will the newGame() method behave differently for different Logic objects? If yes, how will it differ? In this case, yes, it might behave differently based on the game state. Therefore, the equivalence partitions are:

    • PRE_GAME: before the game starts, minefield does not exist yet
    • READY: a new minefield has been created and the app is waiting for the player’s first move
    • IN_PLAY: the current minefield is already in use
    • WON, LOST: let us assume that newGame() behaves the same way for these two values

    Consider the Logic component of the Minesweeper application. What are the EPs for the markCellAt(int x, int y) method? The partitions in bold represent valid inputs.

    • Logic: PRE_GAME, READY, IN_PLAY, WON, LOST
    • x: [MIN_INT..-1] [0..(W-1)] [W..MAX_INT] (assuming a minefield size of WxH)
    • y: [MIN_INT..-1] [0..(H-1)] [H..MAX_INT]
    • Cell at (x,y): HIDDEN, MARKED, CLEARED

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/equivalencePartitions/index.page-vue-render.js b/book/testCaseDesign/equivalencePartitions/index.page-vue-render.js index bff7b65efb..6072d57f04 100644 --- a/book/testCaseDesign/equivalencePartitions/index.page-vue-render.js +++ b/book/testCaseDesign/equivalencePartitions/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"equivalence-partitions"}},[_c('span',[_v("Equivalence partitions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#equivalence-partitions","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/equivalencePartitions/intermediate/index.html b/book/testCaseDesign/equivalencePartitions/intermediate/index.html index cbaa2d59cb..f4ae3640af 100644 --- a/book/testCaseDesign/equivalencePartitions/intermediate/index.html +++ b/book/testCaseDesign/equivalencePartitions/intermediate/index.html @@ -15,7 +15,7 @@

    Can apply EP for OOP methods

    Quality Assurance → Test Case Design → Equivalence Partitions →

    Intermediate

    When deciding EPs of OOP methods, you need to identify the EPs of all data participants that can potentially influence the behaviour of the method, such as,

    • the target object of the method call
    • input parameters of the method call
    • other data/objects accessed by the method such as global variables. This category may not be applicable if using the black box approach (because the test case designer using the black box approach will not know how the method is implemented).

    Consider this method in the DataStack class: push(Object o): boolean

    • Adds o to the top of the stack if the stack is not full.
    • Returns true if the push operation was a success.
    • Throws -
      • MutabilityException if the global flag FREEZE==true.
      • InvalidValueException if o is null.

    EPs:

    • DataStack object: [full] [not full]
    • o: [null] [not null]
    • FREEZE: [true][false]

    Consider a simple Minesweeper app. What are the EPs for the newGame() method of the Logic component?

    As newGame() does not have any parameters, the only obvious participant is the Logic object itself.

    Note that if the glass-box or the grey-box approach is used, other associated objects that are involved in the method might also be included as participants. For example, the Minefield object can be considered as another participant of the newGame() method. Here, the black-box approach is assumed.

    Next, let us identify equivalence partitions for each participant. Will the newGame() method behave differently for different Logic objects? If yes, how will it differ? In this case, yes, it might behave differently based on the game state. Therefore, the equivalence partitions are:

    • PRE_GAME: before the game starts, minefield does not exist yet
    • READY: a new minefield has been created and the app is waiting for the player’s first move
    • IN_PLAY: the current minefield is already in use
    • WON, LOST: let us assume that newGame() behaves the same way for these two values

    Consider the Logic component of the Minesweeper application. What are the EPs for the markCellAt(int x, int y) method? The partitions in bold represent valid inputs.

    • Logic: PRE_GAME, READY, IN_PLAY, WON, LOST
    • x: [MIN_INT..-1] [0..(W-1)] [W..MAX_INT] (assuming a minefield size of WxH)
    • y: [MIN_INT..-1] [0..(H-1)] [H..MAX_INT]
    • Cell at (x,y): HIDDEN, MARKED, CLEARED
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • MutabilityException if the global flag FREEZE==true.
    • InvalidValueException if o is null.

    EPs:

    • DataStack object: [full] [not full]
    • o: [null] [not null]
    • FREEZE: [true][false]

    Consider a simple Minesweeper app. What are the EPs for the newGame() method of the Logic component?

    As newGame() does not have any parameters, the only obvious participant is the Logic object itself.

    Note that if the glass-box or the grey-box approach is used, other associated objects that are involved in the method might also be included as participants. For example, the Minefield object can be considered as another participant of the newGame() method. Here, the black-box approach is assumed.

    Next, let us identify equivalence partitions for each participant. Will the newGame() method behave differently for different Logic objects? If yes, how will it differ? In this case, yes, it might behave differently based on the game state. Therefore, the equivalence partitions are:

    • PRE_GAME: before the game starts, minefield does not exist yet
    • READY: a new minefield has been created and the app is waiting for the player’s first move
    • IN_PLAY: the current minefield is already in use
    • WON, LOST: let us assume that newGame() behaves the same way for these two values

    Consider the Logic component of the Minesweeper application. What are the EPs for the markCellAt(int x, int y) method? The partitions in bold represent valid inputs.

    • Logic: PRE_GAME, READY, IN_PLAY, WON, LOST
    • x: [MIN_INT..-1] [0..(W-1)] [W..MAX_INT] (assuming a minefield size of WxH)
    • y: [MIN_INT..-1] [0..(H-1)] [H..MAX_INT]
    • Cell at (x,y): HIDDEN, MARKED, CLEARED
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/equivalencePartitions/intermediate/index.page-vue-render.js b/book/testCaseDesign/equivalencePartitions/intermediate/index.page-vue-render.js index baf3a17052..eaf184498d 100644 --- a/book/testCaseDesign/equivalencePartitions/intermediate/index.page-vue-render.js +++ b/book/testCaseDesign/equivalencePartitions/intermediate/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"intermediate"}},[_c('span',[_v with(this){return _c('ul',[_c('li',[_v("the target object of the method call")]),_v(" "),_c('li',[_v("input parameters of the method call")]),_v(" "),_c('li',[_v("other data/objects accessed by the method such as global variables. This category may not be applicable if using the black box approach (because the test case designer using the black box approach will not know how the method is implemented).")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/equivalencePartitions/what/index.html b/book/testCaseDesign/equivalencePartitions/what/index.html index ae0e0d51d3..11efb2db83 100644 --- a/book/testCaseDesign/equivalencePartitions/what/index.html +++ b/book/testCaseDesign/equivalencePartitions/what/index.html @@ -14,7 +14,7 @@

    Can explain equivalence partitions

    Quality Assurance → Test Case Design → Equivalence Partitions →

    What

    Consider the testing of the following operation.

    isValidMonth(m) : returns true if m (an int) is in the range [1..12]

    It is inefficient and impractical to test this method for all integer values [-MIN_INT to MAX_INT]. Fortunately, there is no need to test all possible input values. For example, if the input value 233 fails to produce the correct result, the input 234 is likely to fail too; there is no need to test both.

    In general, most SUTs do not treat each input in a unique way. Instead, they process all possible inputs in a small number of distinct ways. That means a range of inputs is treated the same way inside the SUT. -Equivalence partitioning (EP) is a test case design technique that uses the above observation to improve the E&E of testing.

    Equivalence partition (aka equivalence class): A group of test inputs that are likely to be processed by the SUT in the same way.

    By dividing possible inputs into equivalence partitions you can,

    • avoid testing too many inputs from one partition. Testing too many inputs from the same partition is unlikely to find new bugs. This increases the efficiency of testing by reducing redundant test cases.
    • ensure all partitions are tested. Missing partitions can result in bugs going unnoticed. This increases the effectiveness of testing by increasing the chance of finding bugs.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Equivalence partitioning (EP) is a test case design technique that uses the above observation to improve the E&E of testing.

    Equivalence partition (aka equivalence class): A group of test inputs that are likely to be processed by the SUT in the same way.

    By dividing possible inputs into equivalence partitions you can,

    • avoid testing too many inputs from one partition. Testing too many inputs from the same partition is unlikely to find new bugs. This increases the efficiency of testing by reducing redundant test cases.
    • ensure all partitions are tested. Missing partitions can result in bugs going unnoticed. This increases the effectiveness of testing by increasing the chance of finding bugs.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/equivalencePartitions/what/index.page-vue-render.js b/book/testCaseDesign/equivalencePartitions/what/index.page-vue-render.js index 154068250c..0106d3c12b 100644 --- a/book/testCaseDesign/equivalencePartitions/what/index.page-vue-render.js +++ b/book/testCaseDesign/equivalencePartitions/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("By dividing possible inputs into equi with(this){return _c('ul',[_c('li',[_c('strong',[_v("avoid testing too many inputs from one partition.")]),_v(" Testing too many inputs from the same partition is unlikely to find new bugs. This increases the efficiency of testing by reducing redundant test cases.")]),_v(" "),_c('li',[_c('strong',[_v("ensure all partitions are tested.")]),_v(" Missing partitions can result in bugs going unnoticed. This increases the effectiveness of testing by increasing the chance of finding bugs.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/index.html b/book/testCaseDesign/index.html index 43c96261ba..ac8b4be955 100644 --- a/book/testCaseDesign/index.html +++ b/book/testCaseDesign/index.html @@ -23,7 +23,7 @@ [“F”]
    [“A”, “D”, “X”]

    No specific boundary
    No specific boundary
    -No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space



    Combining test inputs

    Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    Test input combination strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    Heuristic: Each valid input at least once in a positive test case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    Heuristic: Test invalid inputs individually before combining them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method




    More

    Testing based on use cases

    Can explain test case design for use case based testing

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.



    Recap

    Recap

    Can explain test case design techniques at a higher level


    Exercises

    Can combine test case design techniques


    Exercises:

    Matric numbers


    isValidDate


    Dispatch resources


    transferTable


    add(Item)


    setWife


    Pre-Release Game


    True or False?


    Design test cases for the day parameter




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space



    Combining test inputs

    Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    Test input combination strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    Heuristic: Each valid input at least once in a positive test case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    Heuristic: Test invalid inputs individually before combining them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method




    More

    Testing based on use cases

    Can explain test case design for use case based testing

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.



    Recap

    Recap

    Can explain test case design techniques at a higher level


    Exercises

    Can combine test case design techniques


    Exercises:

    Matric numbers


    isValidDate


    Dispatch resources


    transferTable


    add(Item)


    setWife


    Pre-Release Game


    True or False?


    Design test cases for the day parameter




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/index.page-vue-render.js b/book/testCaseDesign/index.page-vue-render.js index 1f5fc418e3..4a3d8065df 100644 --- a/book/testCaseDesign/index.page-vue-render.js +++ b/book/testCaseDesign/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"test-case-design"}},[_c('span',[_v("Test case design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#test-case-design","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/introduction/blackVsGlass/index.html b/book/testCaseDesign/introduction/blackVsGlass/index.html index 9c9c8cb602..e6f26eb8ab 100644 --- a/book/testCaseDesign/introduction/blackVsGlass/index.html +++ b/book/testCaseDesign/introduction/blackVsGlass/index.html @@ -13,7 +13,7 @@

    Can explain black box and glass box test case design

    Quality Assurance → Test Case Design → Introduction → -

    Black box versus glass box

    Test case design can be of three types, based on how much of the SUT's internal details are considered when designing test cases:

    • Black-box (aka specification-based or responsibility-based) approach: test cases are designed exclusively based on the SUT’s specified external behavior.

    • White-box (aka glass-box or structured or implementation-based) approach: test cases are designed based on what is known about the SUT’s implementation, i.e. the code.

    • Gray-box approach: test case design uses some important information about the implementation. For example, if the implementation of a sort operation uses different algorithms to sort lists shorter than 1000 items and lists longer than 1000 items, more meaningful test cases can then be added to verify the correctness of both algorithms.

    Black-box and white-box testing


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Black box versus glass box

    Test case design can be of three types, based on how much of the SUT's internal details are considered when designing test cases:

    • Black-box (aka specification-based or responsibility-based) approach: test cases are designed exclusively based on the SUT’s specified external behavior.

    • White-box (aka glass-box or structured or implementation-based) approach: test cases are designed based on what is known about the SUT’s implementation, i.e. the code.

    • Gray-box approach: test case design uses some important information about the implementation. For example, if the implementation of a sort operation uses different algorithms to sort lists shorter than 1000 items and lists longer than 1000 items, more meaningful test cases can then be added to verify the correctness of both algorithms.

    Black-box and white-box testing


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/introduction/blackVsGlass/index.page-vue-render.js b/book/testCaseDesign/introduction/blackVsGlass/index.page-vue-render.js index 1ac7832d46..9e2c8af912 100644 --- a/book/testCaseDesign/introduction/blackVsGlass/index.page-vue-render.js +++ b/book/testCaseDesign/introduction/blackVsGlass/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Test case design can be of three type with(this){return _c('ul',[_c('li',[_c('p',[_c('strong',[_c('em',[_v("Black-box")]),_v(" (aka "),_c('em',[_v("specification-based or responsibility-based")]),_v(") approach")]),_v(": test cases are designed exclusively based on the SUT’s specified external behavior.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('em',[_v("White-box")]),_v(" (aka "),_c('em',[_v("glass-box or structured or implementation-based")]),_v(") approach")]),_v(": test cases are designed based on what is known about the SUT’s implementation, i.e. the code.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('em',[_v("Gray-box")]),_v(" approach")]),_v(": test case design uses "),_c('em',[_v("some")]),_v(" important information about the implementation. For example, if the implementation of a sort operation uses different algorithms to sort lists shorter than 1000 items and lists longer than 1000 items, more meaningful test cases can then be added to verify the correctness of both algorithms.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/introduction/index.html b/book/testCaseDesign/introduction/index.html index 6e2c433a47..3fa4f3c266 100644 --- a/book/testCaseDesign/introduction/index.html +++ b/book/testCaseDesign/introduction/index.html @@ -14,7 +14,7 @@

    Quality Assurance → Test Case Design →

    Introduction

    What

    Can explain the need for deliberate test case design

    Except for trivial , is not practical because such testing often requires a massive/infinite number of test cases.

    Consider the test cases for adding a string object to a :

    • Add an item to an empty collection.
    • Add an item when there is one item in the collection.
    • Add an item when there are 2, 3, .... n items in the collection.
    • Add an item that has an English, a French, a Spanish, ... word.
    • Add an item that is the same as an existing item.
    • Add an item immediately after adding another item.
    • Add an item immediately after system startup.
    • ...

    Exhaustive testing of this operation can take many more test cases.

    Program testing can be used to show the presence of bugs, but never to show their absence! ---Edsger Dijkstra

    Every test case adds to the cost of testing. In some systems, a single test case can cost thousands of dollars e.g. on-field testing of flight-control software. Therefore, test cases need to be designed to make the best use of testing resources. In particular:

    • Testing should be effective i.e., it finds a high percentage of existing bugs e.g., a set of test cases that finds 60 defects is more effective than a set that finds only 30 defects in the same system.

    • Testing should be efficient i.e., it has a high rate of success (bugs found/test cases) a set of 20 test cases that finds 8 defects is more efficient than another set of 40 test cases that finds the same 8 defects.

    For testing to be , each new test you add should be targeting a potential fault that is not already targeted by existing test cases. There are test case design techniques that can help us improve the E&E of testing.


    Exercises:

    Test cases for TriangleDetector


    Exhaustive testing in Minesweeper


    Statements about the E&E of testing



    Positive versus negative test cases

    Can explain positive and negative test cases

    A positive test case is when the test is designed to produce an expected/valid behavior. On the other hand, a negative test case is designed to produce a behavior that indicates an invalid/unexpected situation, such as an error message.

    Consider the testing of the method print(Integer i) which prints the value of i.

    • A positive test case: i == new Integer(50);
    • A negative test case: i == null;

    Black box versus glass box

    Can explain black box and glass box test case design

    Test case design can be of three types, based on how much of the SUT's internal details are considered when designing test cases:

    • Black-box (aka specification-based or responsibility-based) approach: test cases are designed exclusively based on the SUT’s specified external behavior.

    • White-box (aka glass-box or structured or implementation-based) approach: test cases are designed based on what is known about the SUT’s implementation, i.e. the code.

    • Gray-box approach: test case design uses some important information about the implementation. For example, if the implementation of a sort operation uses different algorithms to sort lists shorter than 1000 items and lists longer than 1000 items, more meaningful test cases can then be added to verify the correctness of both algorithms.

    Black-box and white-box testing



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--Edsger Dijkstra

    Every test case adds to the cost of testing. In some systems, a single test case can cost thousands of dollars e.g. on-field testing of flight-control software. Therefore, test cases need to be designed to make the best use of testing resources. In particular:

    • Testing should be effective i.e., it finds a high percentage of existing bugs e.g., a set of test cases that finds 60 defects is more effective than a set that finds only 30 defects in the same system.

    • Testing should be efficient i.e., it has a high rate of success (bugs found/test cases) a set of 20 test cases that finds 8 defects is more efficient than another set of 40 test cases that finds the same 8 defects.

    For testing to be , each new test you add should be targeting a potential fault that is not already targeted by existing test cases. There are test case design techniques that can help us improve the E&E of testing.


    Exercises:

    Test cases for TriangleDetector


    Exhaustive testing in Minesweeper


    Statements about the E&E of testing



    Positive versus negative test cases

    Can explain positive and negative test cases

    A positive test case is when the test is designed to produce an expected/valid behavior. On the other hand, a negative test case is designed to produce a behavior that indicates an invalid/unexpected situation, such as an error message.

    Consider the testing of the method print(Integer i) which prints the value of i.

    • A positive test case: i == new Integer(50);
    • A negative test case: i == null;

    Black box versus glass box

    Can explain black box and glass box test case design

    Test case design can be of three types, based on how much of the SUT's internal details are considered when designing test cases:

    • Black-box (aka specification-based or responsibility-based) approach: test cases are designed exclusively based on the SUT’s specified external behavior.

    • White-box (aka glass-box or structured or implementation-based) approach: test cases are designed based on what is known about the SUT’s implementation, i.e. the code.

    • Gray-box approach: test case design uses some important information about the implementation. For example, if the implementation of a sort operation uses different algorithms to sort lists shorter than 1000 items and lists longer than 1000 items, more meaningful test cases can then be added to verify the correctness of both algorithms.

    Black-box and white-box testing



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/introduction/index.page-vue-render.js b/book/testCaseDesign/introduction/index.page-vue-render.js index e9120efae9..e51cedcf75 100644 --- a/book/testCaseDesign/introduction/index.page-vue-render.js +++ b/book/testCaseDesign/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/introduction/positiveVsNegative/index.html b/book/testCaseDesign/introduction/positiveVsNegative/index.html index 955fd3f92a..5df1079eea 100644 --- a/book/testCaseDesign/introduction/positiveVsNegative/index.html +++ b/book/testCaseDesign/introduction/positiveVsNegative/index.html @@ -13,7 +13,7 @@

    Can explain positive and negative test cases

    Quality Assurance → Test Case Design → Introduction → -

    Positive versus negative test cases

    A positive test case is when the test is designed to produce an expected/valid behavior. On the other hand, a negative test case is designed to produce a behavior that indicates an invalid/unexpected situation, such as an error message.

    Consider the testing of the method print(Integer i) which prints the value of i.

    • A positive test case: i == new Integer(50);
    • A negative test case: i == null;
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Positive versus negative test cases

    A positive test case is when the test is designed to produce an expected/valid behavior. On the other hand, a negative test case is designed to produce a behavior that indicates an invalid/unexpected situation, such as an error message.

    Consider the testing of the method print(Integer i) which prints the value of i.

    • A positive test case: i == new Integer(50);
    • A negative test case: i == null;
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/introduction/positiveVsNegative/index.page-vue-render.js b/book/testCaseDesign/introduction/positiveVsNegative/index.page-vue-render.js index bd9168da2d..139dbeeb82 100644 --- a/book/testCaseDesign/introduction/positiveVsNegative/index.page-vue-render.js +++ b/book/testCaseDesign/introduction/positiveVsNegative/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"positive-versus-negative-test- with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("positive test case")]),_v(" is when the test is designed to produce an expected/valid behavior. On the other hand, a "),_c('em',[_v("negative test case")]),_v(" is designed to produce a behavior that indicates an invalid/unexpected situation, such as an error message.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/introduction/what/index.html b/book/testCaseDesign/introduction/what/index.html index 6c08828e25..be4be0cb70 100644 --- a/book/testCaseDesign/introduction/what/index.html +++ b/book/testCaseDesign/introduction/what/index.html @@ -14,7 +14,7 @@

    Can explain the need for deliberate test case design

    Quality Assurance → Test Case Design → Introduction →

    What

    Except for trivial , is not practical because such testing often requires a massive/infinite number of test cases.

    Consider the test cases for adding a string object to a :

    • Add an item to an empty collection.
    • Add an item when there is one item in the collection.
    • Add an item when there are 2, 3, .... n items in the collection.
    • Add an item that has an English, a French, a Spanish, ... word.
    • Add an item that is the same as an existing item.
    • Add an item immediately after adding another item.
    • Add an item immediately after system startup.
    • ...

    Exhaustive testing of this operation can take many more test cases.

    Program testing can be used to show the presence of bugs, but never to show their absence! ---Edsger Dijkstra

    Every test case adds to the cost of testing. In some systems, a single test case can cost thousands of dollars e.g. on-field testing of flight-control software. Therefore, test cases need to be designed to make the best use of testing resources. In particular:

    • Testing should be effective i.e., it finds a high percentage of existing bugs e.g., a set of test cases that finds 60 defects is more effective than a set that finds only 30 defects in the same system.

    • Testing should be efficient i.e., it has a high rate of success (bugs found/test cases) a set of 20 test cases that finds 8 defects is more efficient than another set of 40 test cases that finds the same 8 defects.

    For testing to be , each new test you add should be targeting a potential fault that is not already targeted by existing test cases. There are test case design techniques that can help us improve the E&E of testing.


    Exercises:

    Test cases for TriangleDetector


    Exhaustive testing in Minesweeper


    Statements about the E&E of testing


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--Edsger Dijkstra

    Every test case adds to the cost of testing. In some systems, a single test case can cost thousands of dollars e.g. on-field testing of flight-control software. Therefore, test cases need to be designed to make the best use of testing resources. In particular:

    • Testing should be effective i.e., it finds a high percentage of existing bugs e.g., a set of test cases that finds 60 defects is more effective than a set that finds only 30 defects in the same system.

    • Testing should be efficient i.e., it has a high rate of success (bugs found/test cases) a set of 20 test cases that finds 8 defects is more efficient than another set of 40 test cases that finds the same 8 defects.

    For testing to be , each new test you add should be targeting a potential fault that is not already targeted by existing test cases. There are test case design techniques that can help us improve the E&E of testing.


    Exercises:

    Test cases for TriangleDetector


    Exhaustive testing in Minesweeper


    Statements about the E&E of testing


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/introduction/what/index.page-vue-render.js b/book/testCaseDesign/introduction/what/index.page-vue-render.js index 0a71f63215..f6a2657071 100644 --- a/book/testCaseDesign/introduction/what/index.page-vue-render.js +++ b/book/testCaseDesign/introduction/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ul',[_c('li',[_c('p',[_c('strong',[_v("Testing should be " with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/more/index.html b/book/testCaseDesign/more/index.html index 258acc3ce2..55bf13f754 100644 --- a/book/testCaseDesign/more/index.html +++ b/book/testCaseDesign/more/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Test Case Design → -

    More

    Testing based on use cases

    Can explain test case design for use case based testing

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    More

    Testing based on use cases

    Can explain test case design for use case based testing

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/more/index.page-vue-render.js b/book/testCaseDesign/more/index.page-vue-render.js index 344e2f9e26..652c1dc185 100644 --- a/book/testCaseDesign/more/index.page-vue-render.js +++ b/book/testCaseDesign/more/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"more"}},[_c('span',[_v("More")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#more","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/more/testingUseCases/index.html b/book/testCaseDesign/more/testingUseCases/index.html index c576b100fe..283c321333 100644 --- a/book/testCaseDesign/more/testingUseCases/index.html +++ b/book/testCaseDesign/more/testingUseCases/index.html @@ -13,7 +13,7 @@

    Can explain test case design for use case based testing

    Quality Assurance → Test Case Design → -

    Testing based on use cases

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Testing based on use cases

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/more/testingUseCases/index.page-vue-render.js b/book/testCaseDesign/more/testingUseCases/index.page-vue-render.js index 2a0e468a15..4b48b185da 100644 --- a/book/testCaseDesign/more/testingUseCases/index.page-vue-render.js +++ b/book/testCaseDesign/more/testingUseCases/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"testing-based-on-use-cases"}}, with(this){return _c('p',[_c('strong',[_v("Use cases can be used for system testing and acceptance testing")]),_v(". For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("user enters his personal data into the system")]),_v(". Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/summary/exercises/index.html b/book/testCaseDesign/summary/exercises/index.html index fd8540fe95..17c21ef362 100644 --- a/book/testCaseDesign/summary/exercises/index.html +++ b/book/testCaseDesign/summary/exercises/index.html @@ -13,7 +13,7 @@ +

    Exercises


    Exercises:

    Matric numbers


    isValidDate


    Dispatch resources


    transferTable


    add(Item)


    setWife


    Pre-Release Game


    True or False?


    Design test cases for the day parameter


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/summary/exercises/index.page-vue-render.js b/book/testCaseDesign/summary/exercises/index.page-vue-render.js index 78a8aa1354..cd0d23355c 100644 --- a/book/testCaseDesign/summary/exercises/index.page-vue-render.js +++ b/book/testCaseDesign/summary/exercises/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"exercises"}},[_c('span',[_v("E with(this){return _c('h5',{attrs:{"id":"exercises-2"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises-2","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/summary/index.html b/book/testCaseDesign/summary/index.html index c6a62ae48e..076528e17e 100644 --- a/book/testCaseDesign/summary/index.html +++ b/book/testCaseDesign/summary/index.html @@ -13,7 +13,7 @@ +

    Recap

    Recap

    Can explain test case design techniques at a higher level


    Exercises

    Can combine test case design techniques


    Exercises:

    Matric numbers


    isValidDate


    Dispatch resources


    transferTable


    add(Item)


    setWife


    Pre-Release Game


    True or False?


    Design test cases for the day parameter



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/summary/index.page-vue-render.js b/book/testCaseDesign/summary/index.page-vue-render.js index a98189e660..1dd6a83895 100644 --- a/book/testCaseDesign/summary/index.page-vue-render.js +++ b/book/testCaseDesign/summary/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"recap"}},[_c('span',[_v("Recap")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#recap","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testCaseDesign/summary/recap/index.html b/book/testCaseDesign/summary/recap/index.html index 96b0189e21..0060d6296f 100644 --- a/book/testCaseDesign/summary/recap/index.html +++ b/book/testCaseDesign/summary/recap/index.html @@ -13,7 +13,7 @@ +

    Recap

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testCaseDesign/summary/recap/index.page-vue-render.js b/book/testCaseDesign/summary/recap/index.page-vue-render.js index d8f9d4ee0a..454feeb377 100644 --- a/book/testCaseDesign/summary/recap/index.page-vue-render.js +++ b/book/testCaseDesign/summary/recap/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain test case design techniques at a higher level")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Quality Assurance → Test Case Design →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"recap"}},[_c('span',[_v("Recap")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#recap","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',{attrs:{"todo":""}})]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/dependencyInjection/how/index.html b/book/testing/dependencyInjection/how/index.html index 50524ab201..3e14a8132e 100644 --- a/book/testing/dependencyInjection/how/index.html +++ b/book/testing/dependencyInjection/how/index.html @@ -140,7 +140,7 @@ -

    Exercises:

    Statements about dependency injection


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exercises:

    Statements about dependency injection


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/dependencyInjection/how/index.page-vue-render.js b/book/testing/dependencyInjection/how/index.page-vue-render.js index 670e8c0aae..6bc56ae42a 100644 --- a/book/testing/dependencyInjection/how/index.page-vue-render.js +++ b/book/testing/dependencyInjection/how/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]) with(this){return _c('h5',{attrs:{"id":"exercises-2"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises-2","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/dependencyInjection/index.html b/book/testing/dependencyInjection/index.html index 586dd877f8..5980573502 100644 --- a/book/testing/dependencyInjection/index.html +++ b/book/testing/dependencyInjection/index.html @@ -140,7 +140,7 @@ -

    Exercises:

    Statements about dependency injection



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Exercises:

    Statements about dependency injection



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/dependencyInjection/index.page-vue-render.js b/book/testing/dependencyInjection/index.page-vue-render.js index ae8498c6e7..013157e854 100644 --- a/book/testing/dependencyInjection/index.page-vue-render.js +++ b/book/testing/dependencyInjection/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"dependency-injection"}},[_c('span',[_v("Dependency injection")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dependency-injection","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/dependencyInjection/what/index.html b/book/testing/dependencyInjection/what/index.html index ee888c8f57..9c1386bc66 100644 --- a/book/testing/dependencyInjection/what/index.html +++ b/book/testing/dependencyInjection/what/index.html @@ -13,7 +13,7 @@

    Can explain dependency injection

    Quality Assurance → Testing → Dependency Injection → -

    What

    Dependency injection is the process of 'injecting' objects to replace current dependencies with a different object. This is often used to inject stubs to isolate the from its so that it can be tested in isolation.

    A Foo object normally depends on a Bar object, but you can inject a BarStub object so that the Foo object no longer depends on a Bar object. Now you can test the Foo object in isolation from the Bar object.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Dependency injection is the process of 'injecting' objects to replace current dependencies with a different object. This is often used to inject stubs to isolate the from its so that it can be tested in isolation.

    A Foo object normally depends on a Bar object, but you can inject a BarStub object so that the Foo object no longer depends on a Bar object. Now you can test the Foo object in isolation from the Bar object.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/dependencyInjection/what/index.page-vue-render.js b/book/testing/dependencyInjection/what/index.page-vue-render.js index 4be85ed04b..ec2e2c206f 100644 --- a/book/testing/dependencyInjection/what/index.page-vue-render.js +++ b/book/testing/dependencyInjection/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('strong',[_c('em',[_v("Dependency injection")]),_v(" is the process of 'injecting' objects to replace current dependencies with a different object.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/index.html b/book/testing/index.html index 16781af448..4a16888fa5 100644 --- a/book/testing/index.html +++ b/book/testing/index.html @@ -903,7 +903,7 @@ (Uncle Bob = Robert C. Martin, the author of Clean Code)
  • Let’s play TDD screencasts by James Shore: [ episode 1 ] [ episode 2 ] -[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?


  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?


  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/index.page-vue-render.js b/book/testing/index.page-vue-render.js index 3353f50a43..93dead053d 100644 --- a/book/testing/index.page-vue-render.js +++ b/book/testing/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"testing"}},[_c('span',[_v("Testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/introduction/index.html b/book/testing/introduction/index.html index 711030d939..a79edebc4c 100644 --- a/book/testing/introduction/index.html +++ b/book/testing/introduction/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Testing → -

    Introduction

    What

    Can explain testing

    Testing: Operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component. –- source: IEEE

    When testing, you execute a set of test cases. A test case specifies how to perform a test. At a minimum, it specifies the input to the software under test (SUT) and the expected behavior.

    Example: A minimal test case for testing a browser:

    • Input – Start the browser using a blank page (vertical scrollbar disabled). Then, load longfile.html located in the test data folder.
    • Expected behavior – The scrollbar should be automatically enabled upon loading longfile.html.
    Other details a test case can contain ... extra

    Test cases can be determined based on the specification, reviewing similar existing systems, or comparing to the past behavior of the SUT.

    For each test case you should do the following:

    1. Feed the input to the SUT
    2. Observe the actual output
    3. Compare actual output with the expected output

    A test case failure is a mismatch between the expected behavior and the actual behavior. A failure indicates a potential defect (or a bug) -- we say 'potential' because the error could be in the test case itself.

    Example: In the browser example above, a test case failure is implied if the scrollbar remains disabled after loading longfile.html. The defect/bug causing that failure could be an uninitialized variable.

    A deeper look at the definition of testing extra


    Testability

    Can explain testability

    Testability is an indication of how easy it is to test an SUT. As testability depends a lot on the design and implementation, you should try to increase the testability when you design and implement software. The higher the testability, the easier it is to achieve better quality software.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Introduction

    What

    Can explain testing

    Testing: Operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component. –- source: IEEE

    When testing, you execute a set of test cases. A test case specifies how to perform a test. At a minimum, it specifies the input to the software under test (SUT) and the expected behavior.

    Example: A minimal test case for testing a browser:

    • Input – Start the browser using a blank page (vertical scrollbar disabled). Then, load longfile.html located in the test data folder.
    • Expected behavior – The scrollbar should be automatically enabled upon loading longfile.html.
    Other details a test case can contain ... extra

    Test cases can be determined based on the specification, reviewing similar existing systems, or comparing to the past behavior of the SUT.

    For each test case you should do the following:

    1. Feed the input to the SUT
    2. Observe the actual output
    3. Compare actual output with the expected output

    A test case failure is a mismatch between the expected behavior and the actual behavior. A failure indicates a potential defect (or a bug) -- we say 'potential' because the error could be in the test case itself.

    Example: In the browser example above, a test case failure is implied if the scrollbar remains disabled after loading longfile.html. The defect/bug causing that failure could be an uninitialized variable.

    A deeper look at the definition of testing extra


    Testability

    Can explain testability

    Testability is an indication of how easy it is to test an SUT. As testability depends a lot on the design and implementation, you should try to increase the testability when you design and implement software. The higher the testability, the easier it is to achieve better quality software.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/introduction/index.page-vue-render.js b/book/testing/introduction/index.page-vue-render.js index f4aef8ca95..9fd9926c19 100644 --- a/book/testing/introduction/index.page-vue-render.js +++ b/book/testing/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/introduction/testability/index.html b/book/testing/introduction/testability/index.html index 2e2c2ed9b6..0f7e94ad71 100644 --- a/book/testing/introduction/testability/index.html +++ b/book/testing/introduction/testability/index.html @@ -13,7 +13,7 @@ +

    Testability

    Testability is an indication of how easy it is to test an SUT. As testability depends a lot on the design and implementation, you should try to increase the testability when you design and implement software. The higher the testability, the easier it is to achieve better quality software.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/introduction/testability/index.page-vue-render.js b/book/testing/introduction/testability/index.page-vue-render.js index 0a0ec462d0..ae2524f34c 100644 --- a/book/testing/introduction/testability/index.page-vue-render.js +++ b/book/testing/introduction/testability/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain testability")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Quality Assurance → Testing → Introduction →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"testability"}},[_c('span',[_v("Testability")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testability","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Testability")]),_v(" is an indication of how easy it is to test an SUT.")]),_v(" As testability depends a lot on the design and implementation, you should try to increase the testability when you design and implement software. The higher the testability, the easier it is to achieve better quality software.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/introduction/what/index.html b/book/testing/introduction/what/index.html index 464b08def6..cb3b6095f2 100644 --- a/book/testing/introduction/what/index.html +++ b/book/testing/introduction/what/index.html @@ -13,7 +13,7 @@

    Can explain testing

    Quality Assurance → Testing → Introduction → -

    What

    Testing: Operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component. –- source: IEEE

    When testing, you execute a set of test cases. A test case specifies how to perform a test. At a minimum, it specifies the input to the software under test (SUT) and the expected behavior.

    Example: A minimal test case for testing a browser:

    • Input – Start the browser using a blank page (vertical scrollbar disabled). Then, load longfile.html located in the test data folder.
    • Expected behavior – The scrollbar should be automatically enabled upon loading longfile.html.
    Other details a test case can contain ... extra

    Test cases can be determined based on the specification, reviewing similar existing systems, or comparing to the past behavior of the SUT.

    For each test case you should do the following:

    1. Feed the input to the SUT
    2. Observe the actual output
    3. Compare actual output with the expected output

    A test case failure is a mismatch between the expected behavior and the actual behavior. A failure indicates a potential defect (or a bug) -- we say 'potential' because the error could be in the test case itself.

    Example: In the browser example above, a test case failure is implied if the scrollbar remains disabled after loading longfile.html. The defect/bug causing that failure could be an uninitialized variable.

    A deeper look at the definition of testing extra

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Testing: Operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component. –- source: IEEE

    When testing, you execute a set of test cases. A test case specifies how to perform a test. At a minimum, it specifies the input to the software under test (SUT) and the expected behavior.

    Example: A minimal test case for testing a browser:

    • Input – Start the browser using a blank page (vertical scrollbar disabled). Then, load longfile.html located in the test data folder.
    • Expected behavior – The scrollbar should be automatically enabled upon loading longfile.html.
    Other details a test case can contain ... extra

    Test cases can be determined based on the specification, reviewing similar existing systems, or comparing to the past behavior of the SUT.

    For each test case you should do the following:

    1. Feed the input to the SUT
    2. Observe the actual output
    3. Compare actual output with the expected output

    A test case failure is a mismatch between the expected behavior and the actual behavior. A failure indicates a potential defect (or a bug) -- we say 'potential' because the error could be in the test case itself.

    Example: In the browser example above, a test case failure is implied if the scrollbar remains disabled after loading longfile.html. The defect/bug causing that failure could be an uninitialized variable.

    A deeper look at the definition of testing extra

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/introduction/what/index.page-vue-render.js b/book/testing/introduction/what/index.page-vue-render.js index c826429c40..3a9dce57ab 100644 --- a/book/testing/introduction/what/index.page-vue-render.js +++ b/book/testing/introduction/what/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ol',[_c('li',[_v("Feed the input to the SUT")]),_v(" "),_c with(this){return _c('p',[_c('strong',[_v("A test case "),_c('em',[_v("failure")]),_v(" is a mismatch between the expected behavior and the actual behavior. A failure indicates a potential "),_c('em',[_v("defect")]),_v(" (or a bug)")]),_v(" -- we say 'potential' because the error could be in the test case itself.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/tdd/how/index.html b/book/testing/tdd/how/index.html index 60c14ccba4..d633723908 100644 --- a/book/testing/tdd/how/index.html +++ b/book/testing/tdd/how/index.html @@ -17,7 +17,7 @@ (Uncle Bob = Robert C. Martin, the author of Clean Code)
  • Let’s play TDD screencasts by James Shore: [ episode 1 ] [ episode 2 ] -[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?
  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/tdd/how/index.page-vue-render.js b/book/testing/tdd/how/index.page-vue-render.js index 8c9b6a09b0..cd5a1ee765 100644 --- a/book/testing/tdd/how/index.page-vue-render.js +++ b/book/testing/tdd/how/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can follow TDD")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Quality Assurance → Testing → Test-Driven Development →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"how"}},[_c('span',[_v("How")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#how","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_v("Note that TDD does not imply writing all the test cases first before writing functional code. Rather, proceed in small steps:")]),_v(" "),_c('ol',[_c('li',[_v("Decide what behavior to implement.")]),_v(" "),_c('li',[_v("Write/modify a test case to test that behavior.")]),_v(" "),_c('li',[_v("Run the test cases and watch them fail.")]),_v(" "),_c('li',[_v("Implement the behavior.")]),_v(" "),_c('li',[_v("Run the test cases.")]),_v(" "),_c('li',[_v("Keep modifying the code and rerunning test cases until they all pass.")]),_v(" "),_c('li',[_v("Refactor code to improve quality.")]),_v(" "),_c('li',[_v("Repeat the cycle for each small unit of behavior that needs to be implemented.")])]),_v(" "),_c('p',[_v("Some TDD proponents cite the following as the three rules of TDD, that once again emphasize the need to proceed in very small steps:")]),_v(" "),_c('ol',[_c('li',[_v("You are not allowed to write any production code unless it is to make a failing unit test pass.")]),_v(" "),_c('li',[_v("You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures.")]),_v(" "),_c('li',[_v("You are not allowed to write any more production code than is sufficient to pass the one failing unit test.")])])]),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"http://butunclebob.com/ArticleS.UncleBob.TheThreeRulesOfTdd"}},[_v("Uncle Bob’s three rules of TDD")]),_v(" -\n(Uncle Bob = Robert C. Martin, the author of Clean Code)")]),_v(" "),_c('li',[_v("Let’s play TDD screencasts by James Shore:\n[ "),_c('a',{attrs:{"href":"http://jamesshore.com/Blog/Lets-Play/Lets-Play-Test-Driven-Development.html"}},[_v("episode 1")]),_v(" ]\n[ "),_c('a',{attrs:{"href":"http://jamesshore.com/Blog/Lets-Play/Episode-2.html"}},[_v("episode 2")]),_v(" ]\n[ "),_c('a',{attrs:{"href":"http://jamesshore.com/index.index"}},[_v("the rest")]),_v(" ]")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"http://www.drdobbs.com/testing/tdd-is-there-really-any-debate-any-longe/240007457"}},[_v("TDD: Is There Really Any Debate Any Longer?")])])])])])])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/tdd/index.html b/book/testing/tdd/index.html index e5bdd18684..dd394e0140 100644 --- a/book/testing/tdd/index.html +++ b/book/testing/tdd/index.html @@ -17,7 +17,7 @@ (Uncle Bob = Robert C. Martin, the author of Clean Code)
  • Let’s play TDD screencasts by James Shore: [ episode 1 ] [ episode 2 ] -[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?

  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?

  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/tdd/index.page-vue-render.js b/book/testing/tdd/index.page-vue-render.js index ee6fd25b51..3fccca630c 100644 --- a/book/testing/tdd/index.page-vue-render.js +++ b/book/testing/tdd/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"tdd"}},[_c('span',[_v("TDD")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tdd","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/tdd/what/index.html b/book/testing/tdd/what/index.html index 211c3c5fcb..b79617901d 100644 --- a/book/testing/tdd/what/index.html +++ b/book/testing/tdd/what/index.html @@ -13,7 +13,7 @@

    Can explain TDD

    Quality Assurance → Testing → Test-Driven Development → -

    What

    Test-Driven Development(TDD) advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments. In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.


    Exercises:

    When do we write tests in TDD?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Test-Driven Development(TDD) advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments. In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.


    Exercises:

    When do we write tests in TDD?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/tdd/what/index.page-vue-render.js b/book/testing/tdd/what/index.page-vue-render.js index 383d0fd542..befa3d8940 100644 --- a/book/testing/tdd/what/index.page-vue-render.js +++ b/book/testing/tdd/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_c('em',[_v("Test-Driven Develo with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testAutomation/index.html b/book/testing/testAutomation/index.html index 82f9bf0529..eb6f52fc46 100644 --- a/book/testing/testAutomation/index.html +++ b/book/testing/testAutomation/index.html @@ -196,7 +196,7 @@ -

    Most modern IDEs have integrated support for testing tools. The figure below shows the JUnit output when running some JUnit tests using the Eclipse IDE.


    Automated testing of GUIs

    Can explain automated GUI testing

    If a software product has a GUI (Graphical User Interface) component, all product-level testing (i.e. the types of testing mentioned above) need to be done using the GUI. However, testing the GUI is much harder than testing the CLI (Command Line Interface) or API, for the following reasons:

    • Most GUIs can support a large number of different operations, many of which can be performed in any arbitrary order.
    • GUI operations are more difficult to automate than API testing. Reliably automating GUI operations and automatically verifying whether the GUI behaves as expected is harder than calling an operation and comparing its return value with an expected value. Therefore, automated regression testing of GUIs is rather difficult.
    • The appearance of a GUI (and sometimes even behavior) can be different across platforms and even environments. For example, a GUI can behave differently based on whether it is minimized or maximized, in focus or out of focus, and in a high resolution display or a low resolution display.

    Moving as much logic as possible out of the GUI can make GUI testing easier. That way, you can bypass the GUI to test the rest of the system using automated API testing. While this still requires the GUI to be tested, the number of such test cases can be reduced as most of the system will have been tested using automated API testing.

    There are testing tools that can automate GUI testing.

    Some tools used for automated GUI testing:

    • TestFX can do automated testing of JavaFX GUIs

    • Visual Studio supports the ‘record replay’ type of GUI test automation.

    • Selenium can be used to automate testing of web application UIs

      Demo video of automated testing of a web application



    Exercises:

    API testing vs GUI testing



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Most modern IDEs have integrated support for testing tools. The figure below shows the JUnit output when running some JUnit tests using the Eclipse IDE.


    Automated testing of GUIs

    Can explain automated GUI testing

    If a software product has a GUI (Graphical User Interface) component, all product-level testing (i.e. the types of testing mentioned above) need to be done using the GUI. However, testing the GUI is much harder than testing the CLI (Command Line Interface) or API, for the following reasons:

    • Most GUIs can support a large number of different operations, many of which can be performed in any arbitrary order.
    • GUI operations are more difficult to automate than API testing. Reliably automating GUI operations and automatically verifying whether the GUI behaves as expected is harder than calling an operation and comparing its return value with an expected value. Therefore, automated regression testing of GUIs is rather difficult.
    • The appearance of a GUI (and sometimes even behavior) can be different across platforms and even environments. For example, a GUI can behave differently based on whether it is minimized or maximized, in focus or out of focus, and in a high resolution display or a low resolution display.

    Moving as much logic as possible out of the GUI can make GUI testing easier. That way, you can bypass the GUI to test the rest of the system using automated API testing. While this still requires the GUI to be tested, the number of such test cases can be reduced as most of the system will have been tested using automated API testing.

    There are testing tools that can automate GUI testing.

    Some tools used for automated GUI testing:

    • TestFX can do automated testing of JavaFX GUIs

    • Visual Studio supports the ‘record replay’ type of GUI test automation.

    • Selenium can be used to automate testing of web application UIs

      Demo video of automated testing of a web application



    Exercises:

    API testing vs GUI testing



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testAutomation/index.page-vue-render.js b/book/testing/testAutomation/index.page-vue-render.js index 0772a0ffe4..f662af5188 100644 --- a/book/testing/testAutomation/index.page-vue-render.js +++ b/book/testing/testAutomation/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"test-automation"}},[_c('span',[_v("Test automation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#test-automation","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testAutomation/testingGuis/index.html b/book/testing/testAutomation/testingGuis/index.html index b32aa555fd..38d35c8861 100644 --- a/book/testing/testAutomation/testingGuis/index.html +++ b/book/testing/testAutomation/testingGuis/index.html @@ -13,7 +13,7 @@

    Can explain automated GUI testing

    Quality Assurance → Testing → Test Automation → -

    Automated testing of GUIs

    If a software product has a GUI (Graphical User Interface) component, all product-level testing (i.e. the types of testing mentioned above) need to be done using the GUI. However, testing the GUI is much harder than testing the CLI (Command Line Interface) or API, for the following reasons:

    • Most GUIs can support a large number of different operations, many of which can be performed in any arbitrary order.
    • GUI operations are more difficult to automate than API testing. Reliably automating GUI operations and automatically verifying whether the GUI behaves as expected is harder than calling an operation and comparing its return value with an expected value. Therefore, automated regression testing of GUIs is rather difficult.
    • The appearance of a GUI (and sometimes even behavior) can be different across platforms and even environments. For example, a GUI can behave differently based on whether it is minimized or maximized, in focus or out of focus, and in a high resolution display or a low resolution display.

    Moving as much logic as possible out of the GUI can make GUI testing easier. That way, you can bypass the GUI to test the rest of the system using automated API testing. While this still requires the GUI to be tested, the number of such test cases can be reduced as most of the system will have been tested using automated API testing.

    There are testing tools that can automate GUI testing.

    Some tools used for automated GUI testing:

    • TestFX can do automated testing of JavaFX GUIs

    • Visual Studio supports the ‘record replay’ type of GUI test automation.

    • Selenium can be used to automate testing of web application UIs

      Demo video of automated testing of a web application



    Exercises:

    API testing vs GUI testing


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Automated testing of GUIs

    If a software product has a GUI (Graphical User Interface) component, all product-level testing (i.e. the types of testing mentioned above) need to be done using the GUI. However, testing the GUI is much harder than testing the CLI (Command Line Interface) or API, for the following reasons:

    • Most GUIs can support a large number of different operations, many of which can be performed in any arbitrary order.
    • GUI operations are more difficult to automate than API testing. Reliably automating GUI operations and automatically verifying whether the GUI behaves as expected is harder than calling an operation and comparing its return value with an expected value. Therefore, automated regression testing of GUIs is rather difficult.
    • The appearance of a GUI (and sometimes even behavior) can be different across platforms and even environments. For example, a GUI can behave differently based on whether it is minimized or maximized, in focus or out of focus, and in a high resolution display or a low resolution display.

    Moving as much logic as possible out of the GUI can make GUI testing easier. That way, you can bypass the GUI to test the rest of the system using automated API testing. While this still requires the GUI to be tested, the number of such test cases can be reduced as most of the system will have been tested using automated API testing.

    There are testing tools that can automate GUI testing.

    Some tools used for automated GUI testing:

    • TestFX can do automated testing of JavaFX GUIs

    • Visual Studio supports the ‘record replay’ type of GUI test automation.

    • Selenium can be used to automate testing of web application UIs

      Demo video of automated testing of a web application



    Exercises:

    API testing vs GUI testing


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testAutomation/testingGuis/index.page-vue-render.js b/book/testing/testAutomation/testingGuis/index.page-vue-render.js index bee03326f5..91fd240006 100644 --- a/book/testing/testAutomation/testingGuis/index.page-vue-render.js +++ b/book/testing/testAutomation/testingGuis/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("There are testing tools that can auto with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testAutomation/testingTextUis/index.html b/book/testing/testAutomation/testingTextUis/index.html index 05326d9e82..abe69c2be5 100644 --- a/book/testing/testAutomation/testingTextUis/index.html +++ b/book/testing/testAutomation/testingTextUis/index.html @@ -86,7 +86,7 @@ -

    Note that the above technique is only suitable when testing CLI apps, and only if the exact output can be predetermined. If the output varies from one run to the other (e.g. it contains a time stamp), this technique will not work. In those cases, you need more sophisticated ways of automating tests.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Note that the above technique is only suitable when testing CLI apps, and only if the exact output can be predetermined. If the output varies from one run to the other (e.g. it contains a time stamp), this technique will not work. In those cases, you need more sophisticated ways of automating tests.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testAutomation/testingTextUis/index.page-vue-render.js b/book/testing/testAutomation/testingTextUis/index.page-vue-render.js index f08a67f94c..56d3267bae 100644 --- a/book/testing/testAutomation/testingTextUis/index.page-vue-render.js +++ b/book/testing/testAutomation/testingTextUis/index.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('code',{pre:true,attrs:{"class":"no-line-numbers hljs"}},[_ with(this){return _c('p',[_v("Note that the above technique is only suitable when testing CLI apps, and only if the exact output can be predetermined. "),_c('span',{staticClass:"dimmed"},[_v("If the output varies from one run to the other (e.g. it contains a time stamp), this technique will not work. In those cases, you need more sophisticated ways of automating tests.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testAutomation/tools/index.html b/book/testing/testAutomation/tools/index.html index 7f2f8d15cd..c82ecf112e 100644 --- a/book/testing/testAutomation/tools/index.html +++ b/book/testing/testAutomation/tools/index.html @@ -64,7 +64,7 @@ -

    Most modern IDEs have integrated support for testing tools. The figure below shows the JUnit output when running some JUnit tests using the Eclipse IDE.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Most modern IDEs have integrated support for testing tools. The figure below shows the JUnit output when running some JUnit tests using the Eclipse IDE.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testAutomation/tools/index.page-vue-render.js b/book/testing/testAutomation/tools/index.page-vue-render.js index 0971abc999..a7027b3e45 100644 --- a/book/testing/testAutomation/tools/index.page-vue-render.js +++ b/book/testing/testAutomation/tools/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"test-automation-tools"}},[_c(' with(this){return _c('p',[_c('strong',[_v("JUnit is a tool for automated testing of Java programs.")]),_v(" Similar tools are available for other languages and for automating different types of testing.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testAutomation/usingTestDrivers/index.html b/book/testing/testAutomation/usingTestDrivers/index.html index e8a3b0923d..297d5c2d1a 100644 --- a/book/testing/testAutomation/usingTestDrivers/index.html +++ b/book/testing/testAutomation/usingTestDrivers/index.html @@ -72,7 +72,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testAutomation/usingTestDrivers/index.page-vue-render.js b/book/testing/testAutomation/usingTestDrivers/index.page-vue-render.js index 17fcc5c851..186b5e61d0 100644 --- a/book/testing/testAutomation/usingTestDrivers/index.page-vue-render.js +++ b/book/testing/testAutomation/usingTestDrivers/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"test-automation-using-test-drivers"}},[_c('span',[_v("Test automation using test drivers")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#test-automation-using-test-drivers","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testAutomation/what/index.html b/book/testing/testAutomation/what/index.html index 988b37c54d..dc6e0144c6 100644 --- a/book/testing/testAutomation/what/index.html +++ b/book/testing/testAutomation/what/index.html @@ -13,7 +13,7 @@ +

    What

    An automated test case can be run programmatically and the result of the test case (pass or fail) is determined programmatically. Compared to manual testing, automated testing reduces the effort required to run tests repeatedly and increases precision of testing (because manual testing is susceptible to human errors).



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testAutomation/what/index.page-vue-render.js b/book/testing/testAutomation/what/index.page-vue-render.js index a2a1272e2f..a3fa840e68 100644 --- a/book/testing/testAutomation/what/index.page-vue-render.js +++ b/book/testing/testAutomation/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_v("[Quora post] "),_c('a',{attrs:{"href":"http://www.quora.com/What-are-good-ways-to-avoid-bugs-while-programming/answer/Mattias-Petter-Johansson"}},[_v("What is the best way to avoid bugs")])]),_v(" "),_c('li',[_v("[Quora post] "),_c('a',{attrs:{"href":"http://www.quora.com/What-kind-of-automated-testing-should-a-startup-have-from-the-beginning-through-the-first-six-months-of-live-operation/answer/Zach-Brock"}},[_v("Is automated testing relevant to startups?")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testCoverage/how/index.html b/book/testing/testCoverage/how/index.html index 741379afbf..e97545a3f8 100644 --- a/book/testing/testCoverage/how/index.html +++ b/book/testing/testCoverage/how/index.html @@ -13,7 +13,7 @@

    Can explain how test coverage works

    Quality Assurance → Testing → Test Coverage → -

    How

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    How

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testCoverage/how/index.page-vue-render.js b/book/testing/testCoverage/how/index.page-vue-render.js index bd610edd52..917f8bb238 100644 --- a/book/testing/testCoverage/how/index.page-vue-render.js +++ b/book/testing/testCoverage/how/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon with(this){return _c('div',{staticClass:"block-embed block-embed-service-youtube",staticStyle:{"position":"relative","padding-bottom":"60.9375%"}},[_c('iframe',{attrs:{"type":"text/html","src":"//www.youtube.com/embed/QDFI19lj4OM","frameborder":"0","webkitallowfullscreen":"","mozallowfullscreen":"","allowfullscreen":""}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testCoverage/index.html b/book/testing/testCoverage/index.html index 46733d24ef..7866545e46 100644 --- a/book/testing/testCoverage/index.html +++ b/book/testing/testCoverage/index.html @@ -100,7 +100,7 @@

    The number of paths through this method is very large, as each possible length of names produces a unique path.

    1. enter -> 2 -> exit (if names is empty)
    2. enter -> 2 -> 3 -> exit (if names has one entry)
    3. enter -> 2 -> 3 -> 2 -> 3 -> exit (if names has two entries) -1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    Exercises:

    Highest intensity coverage



    How

    Can explain how test coverage works

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    Exercises:

    Highest intensity coverage



    How

    Can explain how test coverage works

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testCoverage/index.page-vue-render.js b/book/testing/testCoverage/index.page-vue-render.js index 04a7985664..15f8338a94 100644 --- a/book/testing/testCoverage/index.page-vue-render.js +++ b/book/testing/testCoverage/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"test-coverage"}},[_c('span',[_v("Test coverage")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#test-coverage","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testCoverage/what/index.html b/book/testing/testCoverage/what/index.html index 6c9b057d7c..b01c07d307 100644 --- a/book/testing/testCoverage/what/index.html +++ b/book/testing/testCoverage/what/index.html @@ -100,7 +100,7 @@

    The number of paths through this method is very large, as each possible length of names produces a unique path.

    1. enter -> 2 -> exit (if names is empty)
    2. enter -> 2 -> 3 -> exit (if names has one entry)
    3. enter -> 2 -> 3 -> 2 -> 3 -> exit (if names has two entries) -1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    Exercises:

    Highest intensity coverage


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    Exercises:

    Highest intensity coverage


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testCoverage/what/index.page-vue-render.js b/book/testing/testCoverage/what/index.page-vue-render.js index 891473316c..07cb3c1e70 100644 --- a/book/testing/testCoverage/what/index.page-vue-render.js +++ b/book/testing/testCoverage/what/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Entry/exit coverage")]),_v( with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.html b/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.html index 736ab034ad..8b45f2c81e 100644 --- a/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.html +++ b/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.html @@ -13,7 +13,7 @@

    Can explain the differences between system testing and acceptance testing

    Quality Assurance → Testing → Acceptance Testing → -

    Acceptance versus system testing

    Acceptance testing comes after system testing. Similar to system testing, acceptance testing involves testing the whole system.

    Some differences between system testing and acceptance testing:

    System Testing Acceptance Testing
    Done against the system specification Done against the requirements specification
    Done by testers of the project team Done by a team that represents the customer
    Done on the development environment or a test bed Done on the deployment site or on a close simulation of the deployment site
    Both negative and positive test cases More focus on positive test cases

    Note: negative test cases: cases where the SUT is not expected to work normally e.g. incorrect inputs; positive test cases: cases where the SUT is expected to work normally

    Requirement specification versus system specification

    The requirement specification need not be the same as the system specification. Some example differences:

    Requirements specification System specification
    limited to how the system behaves in normal working conditions can also include details on how it will fail gracefully when pushed beyond limits, how to recover, etc. specification
    written in terms of problems that need to be solved (e.g. provide a method to locate an email quickly) written in terms of how the system solves those problems (e.g. explain the email search feature)
    specifies the interface available for intended end-users could contain additional APIs not available for end-users (for the use of developers/testers)

    However, in many cases one document serves as both a requirement specification and a system specification.

    Passing system tests does not necessarily mean passing acceptance testing. Some examples:

    • The system might work on the testbed environments but might not work the same way in the deployment environment, due to subtle differences between the two environments.
    • The system might conform to the system specification but could fail to solve the problem it was supposed to solve for the user, due to flaws in the system design.

    Exercises:

    Statements about system testing and acceptance testing


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Acceptance versus system testing

    Acceptance testing comes after system testing. Similar to system testing, acceptance testing involves testing the whole system.

    Some differences between system testing and acceptance testing:

    System Testing Acceptance Testing
    Done against the system specification Done against the requirements specification
    Done by testers of the project team Done by a team that represents the customer
    Done on the development environment or a test bed Done on the deployment site or on a close simulation of the deployment site
    Both negative and positive test cases More focus on positive test cases

    Note: negative test cases: cases where the SUT is not expected to work normally e.g. incorrect inputs; positive test cases: cases where the SUT is expected to work normally

    Requirement specification versus system specification

    The requirement specification need not be the same as the system specification. Some example differences:

    Requirements specification System specification
    limited to how the system behaves in normal working conditions can also include details on how it will fail gracefully when pushed beyond limits, how to recover, etc. specification
    written in terms of problems that need to be solved (e.g. provide a method to locate an email quickly) written in terms of how the system solves those problems (e.g. explain the email search feature)
    specifies the interface available for intended end-users could contain additional APIs not available for end-users (for the use of developers/testers)

    However, in many cases one document serves as both a requirement specification and a system specification.

    Passing system tests does not necessarily mean passing acceptance testing. Some examples:

    • The system might work on the testbed environments but might not work the same way in the deployment environment, due to subtle differences between the two environments.
    • The system might conform to the system specification but could fail to solve the problem it was supposed to solve for the user, due to flaws in the system design.

    Exercises:

    Statements about system testing and acceptance testing


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.page-vue-render.js b/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.page-vue-render.js index 1a10fa4947..56c06b8313 100644 --- a/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/acceptanceTesting/acceptanceVsSystemTesting/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('ul',[_c('li',[_v("The system might work on the testbed env with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/acceptanceTesting/index.html b/book/testing/testingTypes/acceptanceTesting/index.html index 1b5be55dd3..cefa4a71b0 100644 --- a/book/testing/testingTypes/acceptanceTesting/index.html +++ b/book/testing/testingTypes/acceptanceTesting/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Testing → Test Types → -

    Acceptance testing

    What

    Can explain acceptance testing

    Acceptance testing (aka User Acceptance Testing (UAT): test the system to ensure it meets the user requirements.

    Acceptance tests give an assurance to the customer that the system does what it is intended to do. Acceptance test cases are often defined at the beginning of the project, usually based on the use case specification. Successful completion of UAT is often a prerequisite to the project sign-off.


    Acceptance versus system testing

    Can explain the differences between system testing and acceptance testing

    Acceptance testing comes after system testing. Similar to system testing, acceptance testing involves testing the whole system.

    Some differences between system testing and acceptance testing:

    System Testing Acceptance Testing
    Done against the system specification Done against the requirements specification
    Done by testers of the project team Done by a team that represents the customer
    Done on the development environment or a test bed Done on the deployment site or on a close simulation of the deployment site
    Both negative and positive test cases More focus on positive test cases

    Note: negative test cases: cases where the SUT is not expected to work normally e.g. incorrect inputs; positive test cases: cases where the SUT is expected to work normally

    Requirement specification versus system specification

    The requirement specification need not be the same as the system specification. Some example differences:

    Requirements specification System specification
    limited to how the system behaves in normal working conditions can also include details on how it will fail gracefully when pushed beyond limits, how to recover, etc. specification
    written in terms of problems that need to be solved (e.g. provide a method to locate an email quickly) written in terms of how the system solves those problems (e.g. explain the email search feature)
    specifies the interface available for intended end-users could contain additional APIs not available for end-users (for the use of developers/testers)

    However, in many cases one document serves as both a requirement specification and a system specification.

    Passing system tests does not necessarily mean passing acceptance testing. Some examples:

    • The system might work on the testbed environments but might not work the same way in the deployment environment, due to subtle differences between the two environments.
    • The system might conform to the system specification but could fail to solve the problem it was supposed to solve for the user, due to flaws in the system design.

    Exercises:

    Statements about system testing and acceptance testing



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Acceptance testing

    What

    Can explain acceptance testing

    Acceptance testing (aka User Acceptance Testing (UAT): test the system to ensure it meets the user requirements.

    Acceptance tests give an assurance to the customer that the system does what it is intended to do. Acceptance test cases are often defined at the beginning of the project, usually based on the use case specification. Successful completion of UAT is often a prerequisite to the project sign-off.


    Acceptance versus system testing

    Can explain the differences between system testing and acceptance testing

    Acceptance testing comes after system testing. Similar to system testing, acceptance testing involves testing the whole system.

    Some differences between system testing and acceptance testing:

    System Testing Acceptance Testing
    Done against the system specification Done against the requirements specification
    Done by testers of the project team Done by a team that represents the customer
    Done on the development environment or a test bed Done on the deployment site or on a close simulation of the deployment site
    Both negative and positive test cases More focus on positive test cases

    Note: negative test cases: cases where the SUT is not expected to work normally e.g. incorrect inputs; positive test cases: cases where the SUT is expected to work normally

    Requirement specification versus system specification

    The requirement specification need not be the same as the system specification. Some example differences:

    Requirements specification System specification
    limited to how the system behaves in normal working conditions can also include details on how it will fail gracefully when pushed beyond limits, how to recover, etc. specification
    written in terms of problems that need to be solved (e.g. provide a method to locate an email quickly) written in terms of how the system solves those problems (e.g. explain the email search feature)
    specifies the interface available for intended end-users could contain additional APIs not available for end-users (for the use of developers/testers)

    However, in many cases one document serves as both a requirement specification and a system specification.

    Passing system tests does not necessarily mean passing acceptance testing. Some examples:

    • The system might work on the testbed environments but might not work the same way in the deployment environment, due to subtle differences between the two environments.
    • The system might conform to the system specification but could fail to solve the problem it was supposed to solve for the user, due to flaws in the system design.

    Exercises:

    Statements about system testing and acceptance testing



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/acceptanceTesting/index.page-vue-render.js b/book/testing/testingTypes/acceptanceTesting/index.page-vue-render.js index f4fde98eef..61282aa8c6 100644 --- a/book/testing/testingTypes/acceptanceTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/acceptanceTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"acceptance-testing"}},[_c('span',[_v("Acceptance testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#acceptance-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/acceptanceTesting/what/index.html b/book/testing/testingTypes/acceptanceTesting/what/index.html index 51ed24132e..f7cb4a1b64 100644 --- a/book/testing/testingTypes/acceptanceTesting/what/index.html +++ b/book/testing/testingTypes/acceptanceTesting/what/index.html @@ -13,7 +13,7 @@

    Can explain acceptance testing

    Quality Assurance → Testing → Acceptance Testing → -

    What

    Acceptance testing (aka User Acceptance Testing (UAT): test the system to ensure it meets the user requirements.

    Acceptance tests give an assurance to the customer that the system does what it is intended to do. Acceptance test cases are often defined at the beginning of the project, usually based on the use case specification. Successful completion of UAT is often a prerequisite to the project sign-off.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Acceptance testing (aka User Acceptance Testing (UAT): test the system to ensure it meets the user requirements.

    Acceptance tests give an assurance to the customer that the system does what it is intended to do. Acceptance test cases are often defined at the beginning of the project, usually based on the use case specification. Successful completion of UAT is often a prerequisite to the project sign-off.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/acceptanceTesting/what/index.page-vue-render.js b/book/testing/testingTypes/acceptanceTesting/what/index.page-vue-render.js index bc754d71c7..041a4348e3 100644 --- a/book/testing/testingTypes/acceptanceTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/acceptanceTesting/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/alphaBetaTesting/index.html b/book/testing/testingTypes/alphaBetaTesting/index.html index 688e38c97f..9d9ae65bde 100644 --- a/book/testing/testingTypes/alphaBetaTesting/index.html +++ b/book/testing/testingTypes/alphaBetaTesting/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Testing → Test Types → -

    Alpha and beta testing

    What

    Can explain alpha and beta testing

    Alpha testing is performed by the users, under controlled conditions set by the software development team.

    Beta testing is performed by a selected subset of target users of the system in their natural work setting.

    An open beta release is the release of not-yet-production-quality-but-almost-there software to the general population. For example, Google’s Gmail was in 'beta' for many years before the label was finally removed.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Alpha and beta testing

    What

    Can explain alpha and beta testing

    Alpha testing is performed by the users, under controlled conditions set by the software development team.

    Beta testing is performed by a selected subset of target users of the system in their natural work setting.

    An open beta release is the release of not-yet-production-quality-but-almost-there software to the general population. For example, Google’s Gmail was in 'beta' for many years before the label was finally removed.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/alphaBetaTesting/index.page-vue-render.js b/book/testing/testingTypes/alphaBetaTesting/index.page-vue-render.js index 4aa503e28f..36af53abbd 100644 --- a/book/testing/testingTypes/alphaBetaTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/alphaBetaTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"alpha-and-beta-testing"}},[_c('span',[_v("Alpha and beta testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#alpha-and-beta-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/alphaBetaTesting/what/index.html b/book/testing/testingTypes/alphaBetaTesting/what/index.html index 9bad738115..ad8f3d9e5b 100644 --- a/book/testing/testingTypes/alphaBetaTesting/what/index.html +++ b/book/testing/testingTypes/alphaBetaTesting/what/index.html @@ -13,7 +13,7 @@

    Can explain alpha and beta testing

    Quality Assurance → Testing → Alpha/Beta Testing → -

    What

    Alpha testing is performed by the users, under controlled conditions set by the software development team.

    Beta testing is performed by a selected subset of target users of the system in their natural work setting.

    An open beta release is the release of not-yet-production-quality-but-almost-there software to the general population. For example, Google’s Gmail was in 'beta' for many years before the label was finally removed.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Alpha testing is performed by the users, under controlled conditions set by the software development team.

    Beta testing is performed by a selected subset of target users of the system in their natural work setting.

    An open beta release is the release of not-yet-production-quality-but-almost-there software to the general population. For example, Google’s Gmail was in 'beta' for many years before the label was finally removed.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/alphaBetaTesting/what/index.page-vue-render.js b/book/testing/testingTypes/alphaBetaTesting/what/index.page-vue-render.js index 0a0d91f5a8..0ec7f9cd78 100644 --- a/book/testing/testingTypes/alphaBetaTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/alphaBetaTesting/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain alpha and beta testing")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Quality Assurance → Testing → Alpha/Beta Testing →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Alpha testing")]),_v(" is performed by the users, under controlled conditions set by the software development team.")])]),_v(" "),_c('p',[_c('strong',[_c('em',[_v("Beta testing")]),_v(" is performed by a selected subset of target users of the system in their natural work setting.")])]),_v(" "),_c('p',[_v("An "),_c('em',[_v("open beta release")]),_v(" is the release of not-yet-production-quality-but-almost-there software to the general population. For example, Google’s Gmail was in 'beta' for many years before the label was finally removed.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/developerTesting/index.html b/book/testing/testingTypes/developerTesting/index.html index 879a1b3095..1db1a0abce 100644 --- a/book/testing/testingTypes/developerTesting/index.html +++ b/book/testing/testingTypes/developerTesting/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Testing → Test Types → -

    Developer testing

    What

    Can explain developer testing

    Developer testing is the testing done by the developers themselves as opposed to dedicated testers or end-users.


    Why

    Can explain the need for early developer testing

    Delaying testing until the full product is complete has a number of disadvantages:

    • Locating the cause of a test case failure is difficult due to the larger search space; in a large system, the search space could be millions of lines of code, written by hundreds of developers! The failure may also be due to multiple inter-related bugs.
    • Fixing a bug found during such testing could result in major rework, especially if the bug originated from the design or during requirements specification i.e. a faulty design or faulty requirements.
    • One bug might 'hide' other bugs, which could emerge only after the first bug is fixed.
    • The delivery may have to be delayed if too many bugs are found during testing.

    Therefore, it is better to do early testing, as hinted by the popular rule of thumb given below, also illustrated by the graph below it.

    The earlier a bug is found, the easier and cheaper to have it fixed.

    Such early testing software is usually, and often by necessity, done by the developers themselves i.e., developer testing.


    Exercises:

    Implications of developers testing their own code


    Cost of bug fixing over time



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Developer testing

    What

    Can explain developer testing

    Developer testing is the testing done by the developers themselves as opposed to dedicated testers or end-users.


    Why

    Can explain the need for early developer testing

    Delaying testing until the full product is complete has a number of disadvantages:

    • Locating the cause of a test case failure is difficult due to the larger search space; in a large system, the search space could be millions of lines of code, written by hundreds of developers! The failure may also be due to multiple inter-related bugs.
    • Fixing a bug found during such testing could result in major rework, especially if the bug originated from the design or during requirements specification i.e. a faulty design or faulty requirements.
    • One bug might 'hide' other bugs, which could emerge only after the first bug is fixed.
    • The delivery may have to be delayed if too many bugs are found during testing.

    Therefore, it is better to do early testing, as hinted by the popular rule of thumb given below, also illustrated by the graph below it.

    The earlier a bug is found, the easier and cheaper to have it fixed.

    Such early testing software is usually, and often by necessity, done by the developers themselves i.e., developer testing.


    Exercises:

    Implications of developers testing their own code


    Cost of bug fixing over time



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/developerTesting/index.page-vue-render.js b/book/testing/testingTypes/developerTesting/index.page-vue-render.js index d81f8d5b5c..59d5b18985 100644 --- a/book/testing/testingTypes/developerTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/developerTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"developer-testing"}},[_c('span',[_v("Developer testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#developer-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/developerTesting/what/index.html b/book/testing/testingTypes/developerTesting/what/index.html index 272df9e2f4..9a48c9f299 100644 --- a/book/testing/testingTypes/developerTesting/what/index.html +++ b/book/testing/testingTypes/developerTesting/what/index.html @@ -13,7 +13,7 @@ +

    What

    Developer testing is the testing done by the developers themselves as opposed to dedicated testers or end-users.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/developerTesting/what/index.page-vue-render.js b/book/testing/testingTypes/developerTesting/what/index.page-vue-render.js index fe887c5142..4feb958ff9 100644 --- a/book/testing/testingTypes/developerTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/developerTesting/what/index.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('p',[_c('span',{staticClass:"badge bg-light text-dark"},[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}})]),_v(" Can explain developer testing")])])])])]),_c('p'),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Quality Assurance → Testing → Developer Testing →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Developer testing")]),_v(" is the testing done by the developers themselves")]),_v(" as opposed to dedicated testers or end-users.")])]),_v(" "),_c('div')])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/developerTesting/why/index.html b/book/testing/testingTypes/developerTesting/why/index.html index a542ed7dd8..26592d3f46 100644 --- a/book/testing/testingTypes/developerTesting/why/index.html +++ b/book/testing/testingTypes/developerTesting/why/index.html @@ -13,7 +13,7 @@

    Can explain the need for early developer testing

    Quality Assurance → Testing → Developer Testing → -

    Why

    Delaying testing until the full product is complete has a number of disadvantages:

    • Locating the cause of a test case failure is difficult due to the larger search space; in a large system, the search space could be millions of lines of code, written by hundreds of developers! The failure may also be due to multiple inter-related bugs.
    • Fixing a bug found during such testing could result in major rework, especially if the bug originated from the design or during requirements specification i.e. a faulty design or faulty requirements.
    • One bug might 'hide' other bugs, which could emerge only after the first bug is fixed.
    • The delivery may have to be delayed if too many bugs are found during testing.

    Therefore, it is better to do early testing, as hinted by the popular rule of thumb given below, also illustrated by the graph below it.

    The earlier a bug is found, the easier and cheaper to have it fixed.

    Such early testing software is usually, and often by necessity, done by the developers themselves i.e., developer testing.


    Exercises:

    Implications of developers testing their own code


    Cost of bug fixing over time


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Why

    Delaying testing until the full product is complete has a number of disadvantages:

    • Locating the cause of a test case failure is difficult due to the larger search space; in a large system, the search space could be millions of lines of code, written by hundreds of developers! The failure may also be due to multiple inter-related bugs.
    • Fixing a bug found during such testing could result in major rework, especially if the bug originated from the design or during requirements specification i.e. a faulty design or faulty requirements.
    • One bug might 'hide' other bugs, which could emerge only after the first bug is fixed.
    • The delivery may have to be delayed if too many bugs are found during testing.

    Therefore, it is better to do early testing, as hinted by the popular rule of thumb given below, also illustrated by the graph below it.

    The earlier a bug is found, the easier and cheaper to have it fixed.

    Such early testing software is usually, and often by necessity, done by the developers themselves i.e., developer testing.


    Exercises:

    Implications of developers testing their own code


    Cost of bug fixing over time


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/developerTesting/why/index.page-vue-render.js b/book/testing/testingTypes/developerTesting/why/index.page-vue-render.js index cb9b40d86b..8eecdd7932 100644 --- a/book/testing/testingTypes/developerTesting/why/index.page-vue-render.js +++ b/book/testing/testingTypes/developerTesting/why/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('blockquote',[_c('p',[_v("The earlier a bug is found, the e with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/dogfooding/index.html b/book/testing/testingTypes/dogfooding/index.html index 60978def35..6b74c1384e 100644 --- a/book/testing/testingTypes/dogfooding/index.html +++ b/book/testing/testingTypes/dogfooding/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Testing → Test Types → -

    Dogfooding

    What

    Can explain dogfooding

    Dogfooding is when creators use their own product in order to experience how end users experience the product. The term is supposedly derived from the phrase "eating our own dogfood". Dogfooding is different from regular testing in that you become an end user, rather than pretend to be an end user.

    For example, suppose a company produces an email client software. Then, getting some of the employees to use that software for their day-to-day emailing would be dogfooding. Such longer-term, consistent, and authentic use of the software can point to areas of improvement that regular testing (which is often short-term and 'simulated') might not encounter.

    Note that dogfooding to be useful, observations need to be deliberately collected and processed i.e., just using the product itself is not enough.


    Exercises:

    Can Dogfooding improve product design?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Dogfooding

    What

    Can explain dogfooding

    Dogfooding is when creators use their own product in order to experience how end users experience the product. The term is supposedly derived from the phrase "eating our own dogfood". Dogfooding is different from regular testing in that you become an end user, rather than pretend to be an end user.

    For example, suppose a company produces an email client software. Then, getting some of the employees to use that software for their day-to-day emailing would be dogfooding. Such longer-term, consistent, and authentic use of the software can point to areas of improvement that regular testing (which is often short-term and 'simulated') might not encounter.

    Note that dogfooding to be useful, observations need to be deliberately collected and processed i.e., just using the product itself is not enough.


    Exercises:

    Can Dogfooding improve product design?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/dogfooding/index.page-vue-render.js b/book/testing/testingTypes/dogfooding/index.page-vue-render.js index 0317a2d6b8..c0df26e9d5 100644 --- a/book/testing/testingTypes/dogfooding/index.page-vue-render.js +++ b/book/testing/testingTypes/dogfooding/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"dogfooding"}},[_c('span',[_v("Dogfooding")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dogfooding","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/dogfooding/what/index.html b/book/testing/testingTypes/dogfooding/what/index.html index 010316bc64..ffc66361e7 100644 --- a/book/testing/testingTypes/dogfooding/what/index.html +++ b/book/testing/testingTypes/dogfooding/what/index.html @@ -13,7 +13,7 @@

    Can explain dogfooding

    Quality Assurance → Testing → Dogfooding → -

    What

    Dogfooding is when creators use their own product in order to experience how end users experience the product. The term is supposedly derived from the phrase "eating our own dogfood". Dogfooding is different from regular testing in that you become an end user, rather than pretend to be an end user.

    For example, suppose a company produces an email client software. Then, getting some of the employees to use that software for their day-to-day emailing would be dogfooding. Such longer-term, consistent, and authentic use of the software can point to areas of improvement that regular testing (which is often short-term and 'simulated') might not encounter.

    Note that dogfooding to be useful, observations need to be deliberately collected and processed i.e., just using the product itself is not enough.


    Exercises:

    Can Dogfooding improve product design?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Dogfooding is when creators use their own product in order to experience how end users experience the product. The term is supposedly derived from the phrase "eating our own dogfood". Dogfooding is different from regular testing in that you become an end user, rather than pretend to be an end user.

    For example, suppose a company produces an email client software. Then, getting some of the employees to use that software for their day-to-day emailing would be dogfooding. Such longer-term, consistent, and authentic use of the software can point to areas of improvement that regular testing (which is often short-term and 'simulated') might not encounter.

    Note that dogfooding to be useful, observations need to be deliberately collected and processed i.e., just using the product itself is not enough.


    Exercises:

    Can Dogfooding improve product design?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/dogfooding/what/index.page-vue-render.js b/book/testing/testingTypes/dogfooding/what/index.page-vue-render.js index 45b780ce75..8c0f72a63e 100644 --- a/book/testing/testingTypes/dogfooding/what/index.page-vue-render.js +++ b/book/testing/testingTypes/dogfooding/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_c('em',[_v("Dogfooding")]),_v( with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/exploratoryVsScriptedTesting/index.html b/book/testing/testingTypes/exploratoryVsScriptedTesting/index.html index a1af7e4169..61829db643 100644 --- a/book/testing/testingTypes/exploratoryVsScriptedTesting/index.html +++ b/book/testing/testingTypes/exploratoryVsScriptedTesting/index.html @@ -15,7 +15,7 @@

    Quality Assurance → Testing → Test Types →

    Exploratory versus scripted testing

    What

    Can explain exploratory testing and scripted testing

    Here are two alternative approaches to testing a software: Scripted testing and Exploratory testing.

    1. Scripted testing: First write a set of test cases based on the expected behavior of the SUT, and then perform testing based on that set of test cases.

    2. Exploratory testing: Devise test cases on-the-fly, creating new test cases based on the results of the past test cases.

    Exploratory testing is ‘the simultaneous learning, test design, and test execution’ [source: bach-et-explained] whereby the nature of the follow-up test case is decided based on the behavior of the previous test cases. In other words, running the system and trying out various operations. It is called exploratory testing because testing is driven by observations during testing. Exploratory testing usually starts with areas identified as error-prone, based on the tester’s past experience with similar systems. One tends to conduct more tests for those operations where more faults are found.

    Here is an example thought process behind a segment of an exploratory testing session:

    “Hmm... looks like feature x is broken. This usually means feature n and k could be broken too; you need to look at them soon. But before that, you should give a good test run to feature y because users can still use the product if feature y works, even if x doesn’t work. Now, if feature y doesn’t work 100%, you have a major problem and this has to be made known to the development team sooner rather than later...”

    Exploratory testing is also known as reactive testing, error guessing technique, attack-based testing, and bug hunting.


    Exercises:

    Statements about exploratory and scripted testing


    Which testing technique is better?


    Explain the concept of exploratory testing using Minesweeper as an example.



    When

    Can explain the choice between exploratory testing and scripted testing

    Which approach is better – scripted or exploratory? A mix is better.

    The success of exploratory testing depends on the tester’s prior experience and intuition. Exploratory testing should be done by experienced testers, using a clear strategy/plan/framework. Ad-hoc exploratory testing by unskilled or inexperienced testers without a clear strategy is not recommended for real-world non-trivial systems. While exploratory testing may allow us to detect some problems in a relatively short time, it is not prudent to use exploratory testing as the sole means of testing a critical system.

    Scripted testing is more systematic, and hence, likely to discover more bugs given sufficient time, while exploratory testing would aid in quick error discovery, especially if the tester has a lot of experience in testing similar systems.

    In some contexts, you will achieve your testing mission better through a more scripted approach; in other contexts, your mission will benefit more from the ability to create and improve tests as you execute them. I find that most situations benefit from a mix of scripted and exploratory approaches. ---[source: bach-et-explained]


    Exercises:

    Which is better?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--[source: bach-et-explained]


    Exercises:

    Which is better?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/exploratoryVsScriptedTesting/index.page-vue-render.js b/book/testing/testingTypes/exploratoryVsScriptedTesting/index.page-vue-render.js index b5560daef7..1bc60c019b 100644 --- a/book/testing/testingTypes/exploratoryVsScriptedTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/exploratoryVsScriptedTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"exploratory-versus-scripted-testing"}},[_c('span',[_v("Exploratory versus scripted testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exploratory-versus-scripted-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.html b/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.html index 85c7760b09..b2fdbe3d88 100644 --- a/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.html +++ b/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.html @@ -14,7 +14,7 @@

    Can explain exploratory testing and scripted testing

    Quality Assurance → Testing → Exploratory and Scripted Testing →

    What

    Here are two alternative approaches to testing a software: Scripted testing and Exploratory testing.

    1. Scripted testing: First write a set of test cases based on the expected behavior of the SUT, and then perform testing based on that set of test cases.

    2. Exploratory testing: Devise test cases on-the-fly, creating new test cases based on the results of the past test cases.

    Exploratory testing is ‘the simultaneous learning, test design, and test execution’ [source: bach-et-explained] whereby the nature of the follow-up test case is decided based on the behavior of the previous test cases. In other words, running the system and trying out various operations. It is called exploratory testing because testing is driven by observations during testing. Exploratory testing usually starts with areas identified as error-prone, based on the tester’s past experience with similar systems. One tends to conduct more tests for those operations where more faults are found.

    Here is an example thought process behind a segment of an exploratory testing session:

    “Hmm... looks like feature x is broken. This usually means feature n and k could be broken too; you need to look at them soon. -But before that, you should give a good test run to feature y because users can still use the product if feature y works, even if x doesn’t work. Now, if feature y doesn’t work 100%, you have a major problem and this has to be made known to the development team sooner rather than later...”

    Exploratory testing is also known as reactive testing, error guessing technique, attack-based testing, and bug hunting.


    Exercises:

    Statements about exploratory and scripted testing


    Which testing technique is better?


    Explain the concept of exploratory testing using Minesweeper as an example.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +But before that, you should give a good test run to feature y because users can still use the product if feature y works, even if x doesn’t work. Now, if feature y doesn’t work 100%, you have a major problem and this has to be made known to the development team sooner rather than later...”

    Exploratory testing is also known as reactive testing, error guessing technique, attack-based testing, and bug hunting.


    Exercises:

    Statements about exploratory and scripted testing


    Which testing technique is better?


    Explain the concept of exploratory testing using Minesweeper as an example.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.page-vue-render.js b/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.page-vue-render.js index 7277c7eef8..4a2191a1e0 100644 --- a/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/exploratoryVsScriptedTesting/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ol',[_c('li',[_c('p',[_c('strong',[_v("Scripted testing:") with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.html b/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.html index a166e2ed53..7cd2f13e6b 100644 --- a/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.html +++ b/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.html @@ -14,7 +14,7 @@

    Can explain the choice between exploratory testing and scripted testing

    Quality Assurance → Testing → Exploratory and Scripted Testing →

    When

    Which approach is better – scripted or exploratory? A mix is better.

    The success of exploratory testing depends on the tester’s prior experience and intuition. Exploratory testing should be done by experienced testers, using a clear strategy/plan/framework. Ad-hoc exploratory testing by unskilled or inexperienced testers without a clear strategy is not recommended for real-world non-trivial systems. While exploratory testing may allow us to detect some problems in a relatively short time, it is not prudent to use exploratory testing as the sole means of testing a critical system.

    Scripted testing is more systematic, and hence, likely to discover more bugs given sufficient time, while exploratory testing would aid in quick error discovery, especially if the tester has a lot of experience in testing similar systems.

    In some contexts, you will achieve your testing mission better through a more scripted approach; in other contexts, your mission will benefit more from the ability to create and improve tests as you execute them. I find that most situations benefit from a mix of scripted and exploratory approaches. ---[source: bach-et-explained]


    Exercises:

    Which is better?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--[source: bach-et-explained]


    Exercises:

    Which is better?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.page-vue-render.js b/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.page-vue-render.js index e40cb76710..506aa96e4c 100644 --- a/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.page-vue-render.js +++ b/book/testing/testingTypes/exploratoryVsScriptedTesting/when/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("Scripted testing is more systematic, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/index.html b/book/testing/testingTypes/index.html index 0a177f25b4..0f1182eb2a 100644 --- a/book/testing/testingTypes/index.html +++ b/book/testing/testingTypes/index.html @@ -503,7 +503,7 @@

    This test case would fail if the browser attempted to load the large file anyway and crashed.

    System testing includes testing against non-functional requirements too. Here are some examples:

    • Performance testing – to ensure the system responds quickly.
    • Load testing (also called stress testing or scalability testing) – to ensure the system can work under heavy load.
    • Security testing – to test how secure the system is.
    • Compatibility testing, interoperability testing – to check whether the system can work with other systems.
    • Usability testing – to test how easy it is to use the system.
    • Portability testing – to test whether the system works on different platforms.


    Alpha and beta testing

    What

    Can explain alpha and beta testing

    Alpha testing is performed by the users, under controlled conditions set by the software development team.

    Beta testing is performed by a selected subset of target users of the system in their natural work setting.

    An open beta release is the release of not-yet-production-quality-but-almost-there software to the general population. For example, Google’s Gmail was in 'beta' for many years before the label was finally removed.



    Dogfooding

    What

    Can explain dogfooding

    Dogfooding is when creators use their own product in order to experience how end users experience the product. The term is supposedly derived from the phrase "eating our own dogfood". Dogfooding is different from regular testing in that you become an end user, rather than pretend to be an end user.

    For example, suppose a company produces an email client software. Then, getting some of the employees to use that software for their day-to-day emailing would be dogfooding. Such longer-term, consistent, and authentic use of the software can point to areas of improvement that regular testing (which is often short-term and 'simulated') might not encounter.

    Note that dogfooding to be useful, observations need to be deliberately collected and processed i.e., just using the product itself is not enough.


    Exercises:

    Can Dogfooding improve product design?




    Developer testing

    What

    Can explain developer testing

    Developer testing is the testing done by the developers themselves as opposed to dedicated testers or end-users.


    Why

    Can explain the need for early developer testing

    Delaying testing until the full product is complete has a number of disadvantages:

    • Locating the cause of a test case failure is difficult due to the larger search space; in a large system, the search space could be millions of lines of code, written by hundreds of developers! The failure may also be due to multiple inter-related bugs.
    • Fixing a bug found during such testing could result in major rework, especially if the bug originated from the design or during requirements specification i.e. a faulty design or faulty requirements.
    • One bug might 'hide' other bugs, which could emerge only after the first bug is fixed.
    • The delivery may have to be delayed if too many bugs are found during testing.

    Therefore, it is better to do early testing, as hinted by the popular rule of thumb given below, also illustrated by the graph below it.

    The earlier a bug is found, the easier and cheaper to have it fixed.

    Such early testing software is usually, and often by necessity, done by the developers themselves i.e., developer testing.


    Exercises:

    Implications of developers testing their own code


    Cost of bug fixing over time




    Exploratory versus scripted testing

    What

    Can explain exploratory testing and scripted testing

    Here are two alternative approaches to testing a software: Scripted testing and Exploratory testing.

    1. Scripted testing: First write a set of test cases based on the expected behavior of the SUT, and then perform testing based on that set of test cases.

    2. Exploratory testing: Devise test cases on-the-fly, creating new test cases based on the results of the past test cases.

    Exploratory testing is ‘the simultaneous learning, test design, and test execution’ [source: bach-et-explained] whereby the nature of the follow-up test case is decided based on the behavior of the previous test cases. In other words, running the system and trying out various operations. It is called exploratory testing because testing is driven by observations during testing. Exploratory testing usually starts with areas identified as error-prone, based on the tester’s past experience with similar systems. One tends to conduct more tests for those operations where more faults are found.

    Here is an example thought process behind a segment of an exploratory testing session:

    “Hmm... looks like feature x is broken. This usually means feature n and k could be broken too; you need to look at them soon. But before that, you should give a good test run to feature y because users can still use the product if feature y works, even if x doesn’t work. Now, if feature y doesn’t work 100%, you have a major problem and this has to be made known to the development team sooner rather than later...”

    Exploratory testing is also known as reactive testing, error guessing technique, attack-based testing, and bug hunting.


    Exercises:

    Statements about exploratory and scripted testing


    Which testing technique is better?


    Explain the concept of exploratory testing using Minesweeper as an example.



    When

    Can explain the choice between exploratory testing and scripted testing

    Which approach is better – scripted or exploratory? A mix is better.

    The success of exploratory testing depends on the tester’s prior experience and intuition. Exploratory testing should be done by experienced testers, using a clear strategy/plan/framework. Ad-hoc exploratory testing by unskilled or inexperienced testers without a clear strategy is not recommended for real-world non-trivial systems. While exploratory testing may allow us to detect some problems in a relatively short time, it is not prudent to use exploratory testing as the sole means of testing a critical system.

    Scripted testing is more systematic, and hence, likely to discover more bugs given sufficient time, while exploratory testing would aid in quick error discovery, especially if the tester has a lot of experience in testing similar systems.

    In some contexts, you will achieve your testing mission better through a more scripted approach; in other contexts, your mission will benefit more from the ability to create and improve tests as you execute them. I find that most situations benefit from a mix of scripted and exploratory approaches. ---[source: bach-et-explained]


    Exercises:

    Which is better?




    Acceptance testing

    What

    Can explain acceptance testing

    Acceptance testing (aka User Acceptance Testing (UAT): test the system to ensure it meets the user requirements.

    Acceptance tests give an assurance to the customer that the system does what it is intended to do. Acceptance test cases are often defined at the beginning of the project, usually based on the use case specification. Successful completion of UAT is often a prerequisite to the project sign-off.


    Acceptance versus system testing

    Can explain the differences between system testing and acceptance testing

    Acceptance testing comes after system testing. Similar to system testing, acceptance testing involves testing the whole system.

    Some differences between system testing and acceptance testing:

    System Testing Acceptance Testing
    Done against the system specification Done against the requirements specification
    Done by testers of the project team Done by a team that represents the customer
    Done on the development environment or a test bed Done on the deployment site or on a close simulation of the deployment site
    Both negative and positive test cases More focus on positive test cases

    Note: negative test cases: cases where the SUT is not expected to work normally e.g. incorrect inputs; positive test cases: cases where the SUT is expected to work normally

    Requirement specification versus system specification

    The requirement specification need not be the same as the system specification. Some example differences:

    Requirements specification System specification
    limited to how the system behaves in normal working conditions can also include details on how it will fail gracefully when pushed beyond limits, how to recover, etc. specification
    written in terms of problems that need to be solved (e.g. provide a method to locate an email quickly) written in terms of how the system solves those problems (e.g. explain the email search feature)
    specifies the interface available for intended end-users could contain additional APIs not available for end-users (for the use of developers/testers)

    However, in many cases one document serves as both a requirement specification and a system specification.

    Passing system tests does not necessarily mean passing acceptance testing. Some examples:

    • The system might work on the testbed environments but might not work the same way in the deployment environment, due to subtle differences between the two environments.
    • The system might conform to the system specification but could fail to solve the problem it was supposed to solve for the user, due to flaws in the system design.

    Exercises:

    Statements about system testing and acceptance testing




    Regression testing

    What

    Can explain regression testing

    When you modify a system, the modification may result in some unintended and undesirable effects on the system. Such an effect is called a regression.

    Regression testing is the re-testing of the software to detect regressions. The typical way to detect regressions is retesting all related components, even if they had been tested before.

    Regression testing is more effective when it is done frequently, after each small change. However, doing so can be prohibitively expensive if testing is done manually. Hence, regression testing is more practical when it is automated.


    Exercises:

    Regression Testing definition: T/F?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--[source: bach-et-explained]


    Exercises:

    Which is better?




    Acceptance testing

    What

    Can explain acceptance testing

    Acceptance testing (aka User Acceptance Testing (UAT): test the system to ensure it meets the user requirements.

    Acceptance tests give an assurance to the customer that the system does what it is intended to do. Acceptance test cases are often defined at the beginning of the project, usually based on the use case specification. Successful completion of UAT is often a prerequisite to the project sign-off.


    Acceptance versus system testing

    Can explain the differences between system testing and acceptance testing

    Acceptance testing comes after system testing. Similar to system testing, acceptance testing involves testing the whole system.

    Some differences between system testing and acceptance testing:

    System Testing Acceptance Testing
    Done against the system specification Done against the requirements specification
    Done by testers of the project team Done by a team that represents the customer
    Done on the development environment or a test bed Done on the deployment site or on a close simulation of the deployment site
    Both negative and positive test cases More focus on positive test cases

    Note: negative test cases: cases where the SUT is not expected to work normally e.g. incorrect inputs; positive test cases: cases where the SUT is expected to work normally

    Requirement specification versus system specification

    The requirement specification need not be the same as the system specification. Some example differences:

    Requirements specification System specification
    limited to how the system behaves in normal working conditions can also include details on how it will fail gracefully when pushed beyond limits, how to recover, etc. specification
    written in terms of problems that need to be solved (e.g. provide a method to locate an email quickly) written in terms of how the system solves those problems (e.g. explain the email search feature)
    specifies the interface available for intended end-users could contain additional APIs not available for end-users (for the use of developers/testers)

    However, in many cases one document serves as both a requirement specification and a system specification.

    Passing system tests does not necessarily mean passing acceptance testing. Some examples:

    • The system might work on the testbed environments but might not work the same way in the deployment environment, due to subtle differences between the two environments.
    • The system might conform to the system specification but could fail to solve the problem it was supposed to solve for the user, due to flaws in the system design.

    Exercises:

    Statements about system testing and acceptance testing




    Regression testing

    What

    Can explain regression testing

    When you modify a system, the modification may result in some unintended and undesirable effects on the system. Such an effect is called a regression.

    Regression testing is the re-testing of the software to detect regressions. The typical way to detect regressions is retesting all related components, even if they had been tested before.

    Regression testing is more effective when it is done frequently, after each small change. However, doing so can be prohibitively expensive if testing is done manually. Hence, regression testing is more practical when it is automated.


    Exercises:

    Regression Testing definition: T/F?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/index.page-vue-render.js b/book/testing/testingTypes/index.page-vue-render.js index 09eb4f237a..dfe28ede49 100644 --- a/book/testing/testingTypes/index.page-vue-render.js +++ b/book/testing/testingTypes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"testing-types"}},[_c('span',[_v("Testing types")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-types","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/integrationTesting/how/index.html b/book/testing/testingTypes/integrationTesting/how/index.html index 0f1ac02d27..1c2113bb4d 100644 --- a/book/testing/testingTypes/integrationTesting/how/index.html +++ b/book/testing/testingTypes/integrationTesting/how/index.html @@ -16,7 +16,7 @@

    How

    Integration testing is not simply a case of repeating the unit test cases using the actual dependencies (instead of the stubs used in unit testing). Instead, integration tests are additional test cases that focus on the interactions between the parts.

    Suppose a class Car uses classes Engine and Wheel. Here is how you would go about doing pure integration tests:

    a) First, unit test Engine and Wheel.
    b) Next, unit test Car in isolation of Engine and Wheel, using stubs for Engine and Wheel.
    c) After that, do an integration test for Car by using it together with the Engine and Wheel classes to ensure that Car integrates properly with the Engine and the Wheel.

    In practice, developers often use a hybrid of unit+integration tests to minimize the need for stubs.

    Here's how a hybrid unit+integration approach could be applied to the same example used above:

    (a) First, unit test Engine and Wheel.
    (b) Next, unit test Car in isolation of Engine and Wheel, using stubs for Engine and Wheel.
    -(c) After that, do an integration test for Car by using it together with the Engine and Wheel classes to ensure that Car integrates properly with the Engine and the Wheel. This step should include test cases that are meant to unit test Car (i.e. test cases used in the step (b) of the example above) as well as test cases that are meant to test the integration of Car with Wheel and Engine (i.e. pure integration test cases used of the step (c) in the example above).

    Note that you no longer need stubs for Engine and Wheel. The downside is that Car is never tested in isolation of its dependencies. Given that its dependencies are already unit tested, the risk of bugs in Engine and Wheel affecting the testing of Car can be considered minimal.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +(c) After that, do an integration test for Car by using it together with the Engine and Wheel classes to ensure that Car integrates properly with the Engine and the Wheel. This step should include test cases that are meant to unit test Car (i.e. test cases used in the step (b) of the example above) as well as test cases that are meant to test the integration of Car with Wheel and Engine (i.e. pure integration test cases used of the step (c) in the example above).

    Note that you no longer need stubs for Engine and Wheel. The downside is that Car is never tested in isolation of its dependencies. Given that its dependencies are already unit tested, the risk of bugs in Engine and Wheel affecting the testing of Car can be considered minimal.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/integrationTesting/how/index.page-vue-render.js b/book/testing/testingTypes/integrationTesting/how/index.page-vue-render.js index 56cd140205..e54acfeb45 100644 --- a/book/testing/testingTypes/integrationTesting/how/index.page-vue-render.js +++ b/book/testing/testingTypes/integrationTesting/how/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Integration testing is not simply a c with(this){return _c('p',[_c('strong',[_v("In practice, developers often use a hybrid of unit+integration tests to minimize the need for stubs.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/integrationTesting/index.html b/book/testing/testingTypes/integrationTesting/index.html index 4a82fe893a..0ac33cea2a 100644 --- a/book/testing/testingTypes/integrationTesting/index.html +++ b/book/testing/testingTypes/integrationTesting/index.html @@ -16,7 +16,7 @@

    Integration testing

    What

    Can explain integration testing

    Integration testing : testing whether different parts of the software work together (i.e. integrates) as expected. Integration tests aim to discover bugs in the 'glue code' related to how components interact with each other. These bugs are often the result of misunderstanding what the parts are supposed to do vs what the parts are actually doing.

    Suppose a class Car uses classes Engine and Wheel. If the Car class assumed a Wheel can support a speed of up to 200 mph but the actual Wheel can only support a speed of up to 150 mph, it is the integration test that is supposed to uncover this discrepancy.


    How

    Can use integration testing

    Integration testing is not simply a case of repeating the unit test cases using the actual dependencies (instead of the stubs used in unit testing). Instead, integration tests are additional test cases that focus on the interactions between the parts.

    Suppose a class Car uses classes Engine and Wheel. Here is how you would go about doing pure integration tests:

    a) First, unit test Engine and Wheel.
    b) Next, unit test Car in isolation of Engine and Wheel, using stubs for Engine and Wheel.
    c) After that, do an integration test for Car by using it together with the Engine and Wheel classes to ensure that Car integrates properly with the Engine and the Wheel.

    In practice, developers often use a hybrid of unit+integration tests to minimize the need for stubs.

    Here's how a hybrid unit+integration approach could be applied to the same example used above:

    (a) First, unit test Engine and Wheel.
    (b) Next, unit test Car in isolation of Engine and Wheel, using stubs for Engine and Wheel.
    -(c) After that, do an integration test for Car by using it together with the Engine and Wheel classes to ensure that Car integrates properly with the Engine and the Wheel. This step should include test cases that are meant to unit test Car (i.e. test cases used in the step (b) of the example above) as well as test cases that are meant to test the integration of Car with Wheel and Engine (i.e. pure integration test cases used of the step (c) in the example above).

    Note that you no longer need stubs for Engine and Wheel. The downside is that Car is never tested in isolation of its dependencies. Given that its dependencies are already unit tested, the risk of bugs in Engine and Wheel affecting the testing of Car can be considered minimal.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +(c) After that, do an integration test for Car by using it together with the Engine and Wheel classes to ensure that Car integrates properly with the Engine and the Wheel. This step should include test cases that are meant to unit test Car (i.e. test cases used in the step (b) of the example above) as well as test cases that are meant to test the integration of Car with Wheel and Engine (i.e. pure integration test cases used of the step (c) in the example above).

    Note that you no longer need stubs for Engine and Wheel. The downside is that Car is never tested in isolation of its dependencies. Given that its dependencies are already unit tested, the risk of bugs in Engine and Wheel affecting the testing of Car can be considered minimal.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/integrationTesting/index.page-vue-render.js b/book/testing/testingTypes/integrationTesting/index.page-vue-render.js index 5c92fb070d..71e9184ffe 100644 --- a/book/testing/testingTypes/integrationTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/integrationTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"integration-testing"}},[_c('span',[_v("Integration testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#integration-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/integrationTesting/what/index.html b/book/testing/testingTypes/integrationTesting/what/index.html index 49c0e92f3f..a09365c7d2 100644 --- a/book/testing/testingTypes/integrationTesting/what/index.html +++ b/book/testing/testingTypes/integrationTesting/what/index.html @@ -13,7 +13,7 @@

    Can explain integration testing

    Quality Assurance → Testing → Integration Testing → -

    What

    Integration testing : testing whether different parts of the software work together (i.e. integrates) as expected. Integration tests aim to discover bugs in the 'glue code' related to how components interact with each other. These bugs are often the result of misunderstanding what the parts are supposed to do vs what the parts are actually doing.

    Suppose a class Car uses classes Engine and Wheel. If the Car class assumed a Wheel can support a speed of up to 200 mph but the actual Wheel can only support a speed of up to 150 mph, it is the integration test that is supposed to uncover this discrepancy.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    Integration testing : testing whether different parts of the software work together (i.e. integrates) as expected. Integration tests aim to discover bugs in the 'glue code' related to how components interact with each other. These bugs are often the result of misunderstanding what the parts are supposed to do vs what the parts are actually doing.

    Suppose a class Car uses classes Engine and Wheel. If the Car class assumed a Wheel can support a speed of up to 200 mph but the actual Wheel can only support a speed of up to 150 mph, it is the integration test that is supposed to uncover this discrepancy.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/integrationTesting/what/index.page-vue-render.js b/book/testing/testingTypes/integrationTesting/what/index.page-vue-render.js index 0e2b90a4eb..c007b70e4f 100644 --- a/book/testing/testingTypes/integrationTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/integrationTesting/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_c('em',[_v("Integration testing")]),_v(" : testing whether different parts of the software "),_c('em',[_v("work together")]),_v(" (i.e. integrates) as expected.")]),_v(" Integration tests aim to discover bugs in the 'glue code' related to how components interact with each other. These bugs are often the result of misunderstanding what the parts are supposed to do vs what the parts are actually doing.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/regressionTesting/index.html b/book/testing/testingTypes/regressionTesting/index.html index 3786a4b0a0..986c6fc8bc 100644 --- a/book/testing/testingTypes/regressionTesting/index.html +++ b/book/testing/testingTypes/regressionTesting/index.html @@ -13,7 +13,7 @@

    Quality Assurance → Testing → Test Types → -

    Regression testing

    What

    Can explain regression testing

    When you modify a system, the modification may result in some unintended and undesirable effects on the system. Such an effect is called a regression.

    Regression testing is the re-testing of the software to detect regressions. The typical way to detect regressions is retesting all related components, even if they had been tested before.

    Regression testing is more effective when it is done frequently, after each small change. However, doing so can be prohibitively expensive if testing is done manually. Hence, regression testing is more practical when it is automated.


    Exercises:

    Regression Testing definition: T/F?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Regression testing

    What

    Can explain regression testing

    When you modify a system, the modification may result in some unintended and undesirable effects on the system. Such an effect is called a regression.

    Regression testing is the re-testing of the software to detect regressions. The typical way to detect regressions is retesting all related components, even if they had been tested before.

    Regression testing is more effective when it is done frequently, after each small change. However, doing so can be prohibitively expensive if testing is done manually. Hence, regression testing is more practical when it is automated.


    Exercises:

    Regression Testing definition: T/F?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/regressionTesting/index.page-vue-render.js b/book/testing/testingTypes/regressionTesting/index.page-vue-render.js index 85afab86ee..d28e41b2fd 100644 --- a/book/testing/testingTypes/regressionTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/regressionTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"regression-testing"}},[_c('span',[_v("Regression testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#regression-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/regressionTesting/what/index.html b/book/testing/testingTypes/regressionTesting/what/index.html index cd52bf53b7..6678c7b09f 100644 --- a/book/testing/testingTypes/regressionTesting/what/index.html +++ b/book/testing/testingTypes/regressionTesting/what/index.html @@ -13,7 +13,7 @@

    Can explain regression testing

    Quality Assurance → Testing → Regression Testing → -

    What

    When you modify a system, the modification may result in some unintended and undesirable effects on the system. Such an effect is called a regression.

    Regression testing is the re-testing of the software to detect regressions. The typical way to detect regressions is retesting all related components, even if they had been tested before.

    Regression testing is more effective when it is done frequently, after each small change. However, doing so can be prohibitively expensive if testing is done manually. Hence, regression testing is more practical when it is automated.


    Exercises:

    Regression Testing definition: T/F?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    When you modify a system, the modification may result in some unintended and undesirable effects on the system. Such an effect is called a regression.

    Regression testing is the re-testing of the software to detect regressions. The typical way to detect regressions is retesting all related components, even if they had been tested before.

    Regression testing is more effective when it is done frequently, after each small change. However, doing so can be prohibitively expensive if testing is done manually. Hence, regression testing is more practical when it is automated.


    Exercises:

    Regression Testing definition: T/F?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/regressionTesting/what/index.page-vue-render.js b/book/testing/testingTypes/regressionTesting/what/index.page-vue-render.js index e9606b3285..e3081b3ebf 100644 --- a/book/testing/testingTypes/regressionTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/regressionTesting/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('p',[_c('strong',[_v("When you modify a system, t with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/systemTesting/index.html b/book/testing/testingTypes/systemTesting/index.html index 5f3d057ccf..7289312738 100644 --- a/book/testing/testingTypes/systemTesting/index.html +++ b/book/testing/testingTypes/systemTesting/index.html @@ -52,7 +52,7 @@ -

    This test case would fail if the browser attempted to load the large file anyway and crashed.

    System testing includes testing against non-functional requirements too. Here are some examples:

    • Performance testing – to ensure the system responds quickly.
    • Load testing (also called stress testing or scalability testing) – to ensure the system can work under heavy load.
    • Security testing – to test how secure the system is.
    • Compatibility testing, interoperability testing – to check whether the system can work with other systems.
    • Usability testing – to test how easy it is to use the system.
    • Portability testing – to test whether the system works on different platforms.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    This test case would fail if the browser attempted to load the large file anyway and crashed.

    System testing includes testing against non-functional requirements too. Here are some examples:

    • Performance testing – to ensure the system responds quickly.
    • Load testing (also called stress testing or scalability testing) – to ensure the system can work under heavy load.
    • Security testing – to test how secure the system is.
    • Compatibility testing, interoperability testing – to check whether the system can work with other systems.
    • Usability testing – to test how easy it is to use the system.
    • Portability testing – to test whether the system works on different platforms.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/systemTesting/index.page-vue-render.js b/book/testing/testingTypes/systemTesting/index.page-vue-render.js index c7d1d9868a..20b41e47a3 100644 --- a/book/testing/testingTypes/systemTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/systemTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"system-testing"}},[_c('span',[_v("System testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#system-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/systemTesting/what/index.html b/book/testing/testingTypes/systemTesting/what/index.html index 4e99257a77..c39a84c0e7 100644 --- a/book/testing/testingTypes/systemTesting/what/index.html +++ b/book/testing/testingTypes/systemTesting/what/index.html @@ -52,7 +52,7 @@ -

    This test case would fail if the browser attempted to load the large file anyway and crashed.

    System testing includes testing against non-functional requirements too. Here are some examples:

    • Performance testing – to ensure the system responds quickly.
    • Load testing (also called stress testing or scalability testing) – to ensure the system can work under heavy load.
    • Security testing – to test how secure the system is.
    • Compatibility testing, interoperability testing – to check whether the system can work with other systems.
    • Usability testing – to test how easy it is to use the system.
    • Portability testing – to test whether the system works on different platforms.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    This test case would fail if the browser attempted to load the large file anyway and crashed.

    System testing includes testing against non-functional requirements too. Here are some examples:

    • Performance testing – to ensure the system responds quickly.
    • Load testing (also called stress testing or scalability testing) – to ensure the system can work under heavy load.
    • Security testing – to test how secure the system is.
    • Compatibility testing, interoperability testing – to check whether the system can work with other systems.
    • Usability testing – to test how easy it is to use the system.
    • Portability testing – to test whether the system works on different platforms.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/systemTesting/what/index.page-vue-render.js b/book/testing/testingTypes/systemTesting/what/index.page-vue-render.js index 82cb50f174..29f2bddecc 100644 --- a/book/testing/testingTypes/systemTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/systemTesting/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("System testing includes testing again with(this){return _c('ul',[_c('li',[_c('em',[_v("Performance testing")]),_v(" – to ensure the system responds quickly.")]),_v(" "),_c('li',[_c('em',[_v("Load testing")]),_v(" (also called "),_c('em',[_v("stress testing")]),_v(" or "),_c('em',[_v("scalability testing")]),_v(") – to ensure the system can work under heavy load.")]),_v(" "),_c('li',[_c('em',[_v("Security testing")]),_v(" – to test how secure the system is.")]),_v(" "),_c('li',[_c('em',[_v("Compatibility testing, interoperability testing")]),_v(" – to check whether the system can work with other systems.")]),_v(" "),_c('li',[_c('em',[_v("Usability testing")]),_v(" – to test how easy it is to use the system.")]),_v(" "),_c('li',[_c('em',[_v("Portability testing")]),_v(" – to test whether the system works on different platforms.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/unitTesting/index.html b/book/testing/testingTypes/unitTesting/index.html index 6fe04f4abc..5307de79e1 100644 --- a/book/testing/testingTypes/unitTesting/index.html +++ b/book/testing/testingTypes/unitTesting/index.html @@ -459,7 +459,7 @@ -

    In addition to Stubs, there are other type of replacements you can use during testing, e.g. Mocks, Fakes, Dummies, Spies.


    Resources:
    • Mocks Aren't Stubs by Martin Fowler -- An in-depth article about how Stubs differ from other types of test helpers.

    Exercises:

    Purpose of stubs



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    In addition to Stubs, there are other type of replacements you can use during testing, e.g. Mocks, Fakes, Dummies, Spies.


    Resources:
    • Mocks Aren't Stubs by Martin Fowler -- An in-depth article about how Stubs differ from other types of test helpers.

    Exercises:

    Purpose of stubs



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/unitTesting/index.page-vue-render.js b/book/testing/testingTypes/unitTesting/index.page-vue-render.js index d35a5bf11f..459e863c81 100644 --- a/book/testing/testingTypes/unitTesting/index.page-vue-render.js +++ b/book/testing/testingTypes/unitTesting/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"unit-testing"}},[_c('span',[_v("Unit testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#unit-testing","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/unitTesting/stubs/index.html b/book/testing/testingTypes/unitTesting/stubs/index.html index 22305ebc9a..c64c3e5247 100644 --- a/book/testing/testingTypes/unitTesting/stubs/index.html +++ b/book/testing/testingTypes/unitTesting/stubs/index.html @@ -306,7 +306,7 @@ -

    In addition to Stubs, there are other type of replacements you can use during testing, e.g. Mocks, Fakes, Dummies, Spies.


    Resources:
    • Mocks Aren't Stubs by Martin Fowler -- An in-depth article about how Stubs differ from other types of test helpers.

    Exercises:

    Purpose of stubs


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    In addition to Stubs, there are other type of replacements you can use during testing, e.g. Mocks, Fakes, Dummies, Spies.


    Resources:
    • Mocks Aren't Stubs by Martin Fowler -- An in-depth article about how Stubs differ from other types of test helpers.

    Exercises:

    Purpose of stubs


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/unitTesting/stubs/index.page-vue-render.js b/book/testing/testingTypes/unitTesting/stubs/index.page-vue-render.js index d2e19a6dcf..a19183d905 100644 --- a/book/testing/testingTypes/unitTesting/stubs/index.page-vue-render.js +++ b/book/testing/testingTypes/unitTesting/stubs/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}}, with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/testing/testingTypes/unitTesting/what/index.html b/book/testing/testingTypes/unitTesting/what/index.html index 9525b4e1a6..9860ddfa68 100644 --- a/book/testing/testingTypes/unitTesting/what/index.html +++ b/book/testing/testingTypes/unitTesting/what/index.html @@ -166,7 +166,7 @@

    Resources:
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +How unit testing (and other good coding practices) could have prevented a major security bug.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/testing/testingTypes/unitTesting/what/index.page-vue-render.js b/book/testing/testingTypes/unitTesting/what/index.page-vue-render.js index 0f2a5fcf02..1d47673f69 100644 --- a/book/testing/testingTypes/unitTesting/what/index.page-vue-render.js +++ b/book/testing/testingTypes/unitTesting/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"http://avandeursen.com/2014/02/22/gotofail-security/"}},[_v("Learning from Apple’s #gotofail Security Bug")]),_v(" -\nHow unit testing (and other good coding practices) could have prevented a major security bug.")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/basicNotations/alternatePaths/index.html b/book/uml/activityDiagrams/basicNotations/alternatePaths/index.html index 8547246494..c4aca1f311 100644 --- a/book/uml/activityDiagrams/basicNotations/alternatePaths/index.html +++ b/book/uml/activityDiagrams/basicNotations/alternatePaths/index.html @@ -13,7 +13,7 @@

    Can interpret alternate paths in activity diagrams

    Tools → UML → Activity Diagrams → -

    Alternate paths

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Alternate paths

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/basicNotations/alternatePaths/index.page-vue-render.js b/book/uml/activityDiagrams/basicNotations/alternatePaths/index.page-vue-render.js index 36b65860e9..bdd81bbbe3 100644 --- a/book/uml/activityDiagrams/basicNotations/alternatePaths/index.page-vue-render.js +++ b/book/uml/activityDiagrams/basicNotations/alternatePaths/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('ul',[_c('li',[_v("Omitting the merge node if it doesn't ca with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/basicNotations/index.html b/book/uml/activityDiagrams/basicNotations/index.html index e2376e0d15..d2c5cf496f 100644 --- a/book/uml/activityDiagrams/basicNotations/index.html +++ b/book/uml/activityDiagrams/basicNotations/index.html @@ -13,7 +13,7 @@

    Tools → UML → Activity Diagrams → -

    Basic notations

    Linear paths

    Can interpret linear paths in activity diagrams

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?



    Alternate paths

    Can interpret alternate paths in activity diagrams

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?



    Parallel paths

    Can interpret parallel paths in activity diagrams

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?



    Rakes

    Can use rakes in activity diagrams

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.


    Swimlanes

    Can explain swimlanes in activity diagrams

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Basic notations

    Linear paths

    Can interpret linear paths in activity diagrams

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?



    Alternate paths

    Can interpret alternate paths in activity diagrams

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?



    Parallel paths

    Can interpret parallel paths in activity diagrams

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?



    Rakes

    Can use rakes in activity diagrams

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.


    Swimlanes

    Can explain swimlanes in activity diagrams

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/basicNotations/index.page-vue-render.js b/book/uml/activityDiagrams/basicNotations/index.page-vue-render.js index b5013b88e3..f64e1c48e4 100644 --- a/book/uml/activityDiagrams/basicNotations/index.page-vue-render.js +++ b/book/uml/activityDiagrams/basicNotations/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"basic-notations"}},[_c('span',[_v("Basic notations")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#basic-notations","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/basicNotations/linearPaths/index.html b/book/uml/activityDiagrams/basicNotations/linearPaths/index.html index 4b7cb29941..1dd0b3bc76 100644 --- a/book/uml/activityDiagrams/basicNotations/linearPaths/index.html +++ b/book/uml/activityDiagrams/basicNotations/linearPaths/index.html @@ -13,7 +13,7 @@

    Can interpret linear paths in activity diagrams

    Tools → UML → Activity Diagrams → -

    Linear paths

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Linear paths

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/basicNotations/linearPaths/index.page-vue-render.js b/book/uml/activityDiagrams/basicNotations/linearPaths/index.page-vue-render.js index 0f5018c477..463c8e5e7c 100644 --- a/book/uml/activityDiagrams/basicNotations/linearPaths/index.page-vue-render.js +++ b/book/uml/activityDiagrams/basicNotations/linearPaths/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_v("Note the slight difference between the "),_c('em', with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/basicNotations/parallelPaths/index.html b/book/uml/activityDiagrams/basicNotations/parallelPaths/index.html index 6fb050b4cc..d7f39dd5a0 100644 --- a/book/uml/activityDiagrams/basicNotations/parallelPaths/index.html +++ b/book/uml/activityDiagrams/basicNotations/parallelPaths/index.html @@ -13,7 +13,7 @@

    Can interpret parallel paths in activity diagrams

    Tools → UML → Activity Diagrams → -

    Parallel paths

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Parallel paths

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/basicNotations/parallelPaths/index.page-vue-render.js b/book/uml/activityDiagrams/basicNotations/parallelPaths/index.page-vue-render.js index c96dffa68b..da9ad2d4c2 100644 --- a/book/uml/activityDiagrams/basicNotations/parallelPaths/index.page-vue-render.js +++ b/book/uml/activityDiagrams/basicNotations/parallelPaths/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('strong',[_v("all parallel paths should be complete before with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/basicNotations/rakes/index.html b/book/uml/activityDiagrams/basicNotations/rakes/index.html index 14f85b6043..e872694335 100644 --- a/book/uml/activityDiagrams/basicNotations/rakes/index.html +++ b/book/uml/activityDiagrams/basicNotations/rakes/index.html @@ -13,7 +13,7 @@ +

    Rakes

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/basicNotations/rakes/index.page-vue-render.js b/book/uml/activityDiagrams/basicNotations/rakes/index.page-vue-render.js index 2efe6439ab..3689c15bb6 100644 --- a/book/uml/activityDiagrams/basicNotations/rakes/index.page-vue-render.js +++ b/book/uml/activityDiagrams/basicNotations/rakes/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"rakes"}},[_c('span',[_v("Rakes with(this){return _c('p',[_c('strong',[_v("The rake notation is used to indicate that a part of the activity is given as a separate diagram.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/basicNotations/swimlanes/index.html b/book/uml/activityDiagrams/basicNotations/swimlanes/index.html index ac9441cab4..98e9f8eb22 100644 --- a/book/uml/activityDiagrams/basicNotations/swimlanes/index.html +++ b/book/uml/activityDiagrams/basicNotations/swimlanes/index.html @@ -13,7 +13,7 @@ +

    Swimlanes

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/basicNotations/swimlanes/index.page-vue-render.js b/book/uml/activityDiagrams/basicNotations/swimlanes/index.page-vue-render.js index e8b4bf26cc..cf31a97d90 100644 --- a/book/uml/activityDiagrams/basicNotations/swimlanes/index.page-vue-render.js +++ b/book/uml/activityDiagrams/basicNotations/swimlanes/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"swimlanes"}},[_c('span',[_v("S with(this){return _c('p',[_c('strong',[_v("It is possible to "),_c('em',[_v("partition")]),_v(" an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called "),_c('em',[_v("swimlane diagrams")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/index.html b/book/uml/activityDiagrams/index.html index f88c284c15..7bf8ba93c7 100644 --- a/book/uml/activityDiagrams/index.html +++ b/book/uml/activityDiagrams/index.html @@ -13,7 +13,7 @@

    Tools → UML → -

    Activity diagrams

    Introduction

    Introduction

    Can explain activity diagrams

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]



    Basic notations

    Linear paths

    Can interpret linear paths in activity diagrams

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?



    Alternate paths

    Can interpret alternate paths in activity diagrams

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?



    Parallel paths

    Can interpret parallel paths in activity diagrams

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?



    Rakes

    Can use rakes in activity diagrams

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.


    Swimlanes

    Can explain swimlanes in activity diagrams

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Activity diagrams

    Introduction

    Introduction

    Can explain activity diagrams

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]



    Basic notations

    Linear paths

    Can interpret linear paths in activity diagrams

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?



    Alternate paths

    Can interpret alternate paths in activity diagrams

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?



    Parallel paths

    Can interpret parallel paths in activity diagrams

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?



    Rakes

    Can use rakes in activity diagrams

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.


    Swimlanes

    Can explain swimlanes in activity diagrams

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/index.page-vue-render.js b/book/uml/activityDiagrams/index.page-vue-render.js index 3c317bfe1b..a9fab98717 100644 --- a/book/uml/activityDiagrams/index.page-vue-render.js +++ b/book/uml/activityDiagrams/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"activity-diagrams"}},[_c('span',[_v("Activity diagrams")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#activity-diagrams","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/introduction/index.html b/book/uml/activityDiagrams/introduction/index.html index eb30623228..e628631125 100644 --- a/book/uml/activityDiagrams/introduction/index.html +++ b/book/uml/activityDiagrams/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    Introduction

    Can explain activity diagrams

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/introduction/index.page-vue-render.js b/book/uml/activityDiagrams/introduction/index.page-vue-render.js index 1fb5ea8967..e269c8f98d 100644 --- a/book/uml/activityDiagrams/introduction/index.page-vue-render.js +++ b/book/uml/activityDiagrams/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/activityDiagrams/introduction/what/index.html b/book/uml/activityDiagrams/introduction/what/index.html index 1f2f7eb2d9..9c8e4cc85c 100644 --- a/book/uml/activityDiagrams/introduction/what/index.html +++ b/book/uml/activityDiagrams/introduction/what/index.html @@ -13,7 +13,7 @@ +

    Introduction

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/activityDiagrams/introduction/what/index.page-vue-render.js b/book/uml/activityDiagrams/introduction/what/index.page-vue-render.js index b17ca91c91..c5a82fb631 100644 --- a/book/uml/activityDiagrams/introduction/what/index.page-vue-render.js +++ b/book/uml/activityDiagrams/introduction/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v with(this){return _c('span',{staticClass:"dimmed"},[_c('em',[_v("Flow charts")]),_v(" are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/abstractClasses/index.html b/book/uml/classDiagrams/abstractClasses/index.html index 13658d7f86..ae57ee0b57 100644 --- a/book/uml/classDiagrams/abstractClasses/index.html +++ b/book/uml/classDiagrams/abstractClasses/index.html @@ -13,7 +13,7 @@ +

    Abstract classes

    What

    Can interpret abstract classes in class diagrams

    You can use italics or {abstract} (preferred) keyword to denote abstract classes/methods.

    Example:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/abstractClasses/index.page-vue-render.js b/book/uml/classDiagrams/abstractClasses/index.page-vue-render.js index 0b42635d5e..d1a55bc4d1 100644 --- a/book/uml/classDiagrams/abstractClasses/index.page-vue-render.js +++ b/book/uml/classDiagrams/abstractClasses/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"abstract-classes"}},[_c('span',[_v("Abstract classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#abstract-classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/abstractClasses/what/index.html b/book/uml/classDiagrams/abstractClasses/what/index.html index 31a43ab5e0..f96706a3be 100644 --- a/book/uml/classDiagrams/abstractClasses/what/index.html +++ b/book/uml/classDiagrams/abstractClasses/what/index.html @@ -13,7 +13,7 @@ +

    What

    You can use italics or {abstract} (preferred) keyword to denote abstract classes/methods.

    Example:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/abstractClasses/what/index.page-vue-render.js b/book/uml/classDiagrams/abstractClasses/what/index.page-vue-render.js index 04f2c30772..0bae7214e1 100644 --- a/book/uml/classDiagrams/abstractClasses/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/abstractClasses/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("You can use "),_c('em',[_v("italics")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{abstract}")]),_v(" (preferred) keyword to denote abstract classes/methods.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/aggregation/index.html b/book/uml/classDiagrams/aggregation/index.html index f51aff60bd..6c27c44d63 100644 --- a/book/uml/classDiagrams/aggregation/index.html +++ b/book/uml/classDiagrams/aggregation/index.html @@ -13,7 +13,7 @@

    Tools → UML → Class Diagrams → -

    Aggregation

    Aggregation

    Can interpret aggregation in class diagrams

    UML uses a hollow diamond to indicate an aggregation.

    Notation:

    Example:

    Aggregation vs Composition

    The distinction between composition (◆) and aggregation (◇) is rather blurred. Martin Fowler’s famous book UML Distilled advocates omitting the aggregation symbol altogether because using it adds more confusion than clarity.


    Exercises:

    Which one is not recommended to use?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Aggregation

    Aggregation

    Can interpret aggregation in class diagrams

    UML uses a hollow diamond to indicate an aggregation.

    Notation:

    Example:

    Aggregation vs Composition

    The distinction between composition (◆) and aggregation (◇) is rather blurred. Martin Fowler’s famous book UML Distilled advocates omitting the aggregation symbol altogether because using it adds more confusion than clarity.


    Exercises:

    Which one is not recommended to use?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/aggregation/index.page-vue-render.js b/book/uml/classDiagrams/aggregation/index.page-vue-render.js index f7331e0bc3..41a8bab659 100644 --- a/book/uml/classDiagrams/aggregation/index.page-vue-render.js +++ b/book/uml/classDiagrams/aggregation/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"aggregation"}},[_c('span',[_v("Aggregation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aggregation","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/aggregation/what/index.html b/book/uml/classDiagrams/aggregation/what/index.html index 11247f8232..7e42ea3adb 100644 --- a/book/uml/classDiagrams/aggregation/what/index.html +++ b/book/uml/classDiagrams/aggregation/what/index.html @@ -13,7 +13,7 @@

    Can interpret aggregation in class diagrams

    Tools → UML → Class Diagrams → Aggregation → -

    Aggregation

    UML uses a hollow diamond to indicate an aggregation.

    Notation:

    Example:

    Aggregation vs Composition

    The distinction between composition (◆) and aggregation (◇) is rather blurred. Martin Fowler’s famous book UML Distilled advocates omitting the aggregation symbol altogether because using it adds more confusion than clarity.


    Exercises:

    Which one is not recommended to use?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Aggregation

    UML uses a hollow diamond to indicate an aggregation.

    Notation:

    Example:

    Aggregation vs Composition

    The distinction between composition (◆) and aggregation (◇) is rather blurred. Martin Fowler’s famous book UML Distilled advocates omitting the aggregation symbol altogether because using it adds more confusion than clarity.


    Exercises:

    Which one is not recommended to use?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/aggregation/what/index.page-vue-render.js b/book/uml/classDiagrams/aggregation/what/index.page-vue-render.js index 6d8cd259cc..d7d1476414 100644 --- a/book/uml/classDiagrams/aggregation/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/aggregation/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("UML uses a hollow diamond to indicate with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associationClasses/index.html b/book/uml/classDiagrams/associationClasses/index.html index 2c49ac1aa2..8b33b73bb9 100644 --- a/book/uml/classDiagrams/associationClasses/index.html +++ b/book/uml/classDiagrams/associationClasses/index.html @@ -13,7 +13,7 @@ +

    Association classes

    Association classes

    Can interpret association classes in class diagrams

    Association classes are denoted as a connection to an association link using a dashed line as shown below.

    In this example Loan is an association class because it stores information about the borrows association between the User and the Book.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associationClasses/index.page-vue-render.js b/book/uml/classDiagrams/associationClasses/index.page-vue-render.js index d7228d98aa..2d387ebd1a 100644 --- a/book/uml/classDiagrams/associationClasses/index.page-vue-render.js +++ b/book/uml/classDiagrams/associationClasses/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"association-classes"}},[_c('span',[_v("Association classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#association-classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associationClasses/what/index.html b/book/uml/classDiagrams/associationClasses/what/index.html index 9dc15fab72..851ac69d73 100644 --- a/book/uml/classDiagrams/associationClasses/what/index.html +++ b/book/uml/classDiagrams/associationClasses/what/index.html @@ -13,7 +13,7 @@ +

    Association classes

    Association classes are denoted as a connection to an association link using a dashed line as shown below.

    In this example Loan is an association class because it stores information about the borrows association between the User and the Book.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associationClasses/what/index.page-vue-render.js b/book/uml/classDiagrams/associationClasses/what/index.page-vue-render.js index dc19d9e183..6d626d9bf6 100644 --- a/book/uml/classDiagrams/associationClasses/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/associationClasses/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"association-classes"}},[_c('span',[_v("Association classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#association-classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associations/index.html b/book/uml/classDiagrams/associations/index.html index f7bd3edf78..3c96ee8d04 100644 --- a/book/uml/classDiagrams/associations/index.html +++ b/book/uml/classDiagrams/associations/index.html @@ -353,7 +353,7 @@ -

    Association roles are optional to show. They are particularly useful for differentiating among multiple associations between the same two classes.

    In each the three associations between the Flight class and the Airport class given below, the Airport class plays a different role.


    Labels

    Can explain/use association labels in class diagrams

    Association labels describe the meaning of the association. The arrow head indicates the direction in which the label is to be read.

    In this example, the same association is described using two different labels.

    • Diagram on the left: Admin class is associated with Student class because an Admin object uses a Student object.
    • Diagram on the right: Admin class is associated with Student class because a Student object is used by an Admin object.

    Multiplicity

    Can explain what is the multiplicity of an association

    Commonly used multiplicities:

    • 0..1 : optional, can be linked to 0 or 1 objects.
    • 1 : compulsory, must be linked to one object at all times.
    • * : can be linked to 0 or more objects.
    • n..m : the number of linked objects must be within n to m inclusive e.g., 2..5, 1..* (one or more), *..5 (up to five)

    In the diagram below, an Admin object administers (is in charge of) any number of students but a Student object must always be under the charge of exactly one Admin object.

    In the diagram below,

    • Each student must be supervised by exactly one professor. i.e. There cannot be a student who doesn't have a supervisor or has multiple supervisors.
    • A professor cannot supervise more than 5 students but can have no students to supervise.
    • An admin can handle any number of professors and any number of students, including none.
    • A professor/student can be handled by any number of admins, including none.

    There is no default multiplicity in UML. If a class diagram does not show the multiplicity of an association, it simply means the multiplicity is unspecified.


    Exercises:

    Which statement agrees with the multiplicity shown in this diagram?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Association roles are optional to show. They are particularly useful for differentiating among multiple associations between the same two classes.

    In each the three associations between the Flight class and the Airport class given below, the Airport class plays a different role.


    Labels

    Can explain/use association labels in class diagrams

    Association labels describe the meaning of the association. The arrow head indicates the direction in which the label is to be read.

    In this example, the same association is described using two different labels.

    • Diagram on the left: Admin class is associated with Student class because an Admin object uses a Student object.
    • Diagram on the right: Admin class is associated with Student class because a Student object is used by an Admin object.

    Multiplicity

    Can explain what is the multiplicity of an association

    Commonly used multiplicities:

    • 0..1 : optional, can be linked to 0 or 1 objects.
    • 1 : compulsory, must be linked to one object at all times.
    • * : can be linked to 0 or more objects.
    • n..m : the number of linked objects must be within n to m inclusive e.g., 2..5, 1..* (one or more), *..5 (up to five)

    In the diagram below, an Admin object administers (is in charge of) any number of students but a Student object must always be under the charge of exactly one Admin object.

    In the diagram below,

    • Each student must be supervised by exactly one professor. i.e. There cannot be a student who doesn't have a supervisor or has multiple supervisors.
    • A professor cannot supervise more than 5 students but can have no students to supervise.
    • An admin can handle any number of professors and any number of students, including none.
    • A professor/student can be handled by any number of admins, including none.

    There is no default multiplicity in UML. If a class diagram does not show the multiplicity of an association, it simply means the multiplicity is unspecified.


    Exercises:

    Which statement agrees with the multiplicity shown in this diagram?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associations/index.page-vue-render.js b/book/uml/classDiagrams/associations/index.page-vue-render.js index d0953d2798..29f437f477 100644 --- a/book/uml/classDiagrams/associations/index.page-vue-render.js +++ b/book/uml/classDiagrams/associations/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"associations"}},[_c('span',[_v("Associations")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#associations","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associations/labels/index.html b/book/uml/classDiagrams/associations/labels/index.html index 035cae3c93..bf84b93a45 100644 --- a/book/uml/classDiagrams/associations/labels/index.html +++ b/book/uml/classDiagrams/associations/labels/index.html @@ -13,7 +13,7 @@

    Can explain/use association labels in class diagrams

    Tools → UML → Class Diagrams → Associations → -

    Labels

    Association labels describe the meaning of the association. The arrow head indicates the direction in which the label is to be read.

    In this example, the same association is described using two different labels.

    • Diagram on the left: Admin class is associated with Student class because an Admin object uses a Student object.
    • Diagram on the right: Admin class is associated with Student class because a Student object is used by an Admin object.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Labels

    Association labels describe the meaning of the association. The arrow head indicates the direction in which the label is to be read.

    In this example, the same association is described using two different labels.

    • Diagram on the left: Admin class is associated with Student class because an Admin object uses a Student object.
    • Diagram on the right: Admin class is associated with Student class because a Student object is used by an Admin object.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associations/labels/index.page-vue-render.js b/book/uml/classDiagrams/associations/labels/index.page-vue-render.js index c52ca9eb33..2537f7a36a 100644 --- a/book/uml/classDiagrams/associations/labels/index.page-vue-render.js +++ b/book/uml/classDiagrams/associations/labels/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"labels"}},[_c('span',[_v("Labe with(this){return _c('p',[_c('strong',[_c('em',[_v("Association labels")]),_v(" describe the meaning of the association.")]),_v(" The arrow head indicates the direction in which the label is to be read.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associations/multiplicity/index.html b/book/uml/classDiagrams/associations/multiplicity/index.html index 26972fba1b..0fe7cdd6f1 100644 --- a/book/uml/classDiagrams/associations/multiplicity/index.html +++ b/book/uml/classDiagrams/associations/multiplicity/index.html @@ -13,7 +13,7 @@

    Can explain what is the multiplicity of an association

    Tools → UML → Class Diagrams → Associations → -

    Multiplicity

    Commonly used multiplicities:

    • 0..1 : optional, can be linked to 0 or 1 objects.
    • 1 : compulsory, must be linked to one object at all times.
    • * : can be linked to 0 or more objects.
    • n..m : the number of linked objects must be within n to m inclusive e.g., 2..5, 1..* (one or more), *..5 (up to five)

    In the diagram below, an Admin object administers (is in charge of) any number of students but a Student object must always be under the charge of exactly one Admin object.

    In the diagram below,

    • Each student must be supervised by exactly one professor. i.e. There cannot be a student who doesn't have a supervisor or has multiple supervisors.
    • A professor cannot supervise more than 5 students but can have no students to supervise.
    • An admin can handle any number of professors and any number of students, including none.
    • A professor/student can be handled by any number of admins, including none.

    There is no default multiplicity in UML. If a class diagram does not show the multiplicity of an association, it simply means the multiplicity is unspecified.


    Exercises:

    Which statement agrees with the multiplicity shown in this diagram?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Multiplicity

    Commonly used multiplicities:

    • 0..1 : optional, can be linked to 0 or 1 objects.
    • 1 : compulsory, must be linked to one object at all times.
    • * : can be linked to 0 or more objects.
    • n..m : the number of linked objects must be within n to m inclusive e.g., 2..5, 1..* (one or more), *..5 (up to five)

    In the diagram below, an Admin object administers (is in charge of) any number of students but a Student object must always be under the charge of exactly one Admin object.

    In the diagram below,

    • Each student must be supervised by exactly one professor. i.e. There cannot be a student who doesn't have a supervisor or has multiple supervisors.
    • A professor cannot supervise more than 5 students but can have no students to supervise.
    • An admin can handle any number of professors and any number of students, including none.
    • A professor/student can be handled by any number of admins, including none.

    There is no default multiplicity in UML. If a class diagram does not show the multiplicity of an association, it simply means the multiplicity is unspecified.


    Exercises:

    Which statement agrees with the multiplicity shown in this diagram?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associations/multiplicity/index.page-vue-render.js b/book/uml/classDiagrams/associations/multiplicity/index.page-vue-render.js index 872fd5b230..162aafa47e 100644 --- a/book/uml/classDiagrams/associations/multiplicity/index.page-vue-render.js +++ b/book/uml/classDiagrams/associations/multiplicity/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-num with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associations/navigability/index.html b/book/uml/classDiagrams/associations/navigability/index.html index 30b1b378d5..0c662cf40f 100644 --- a/book/uml/classDiagrams/associations/navigability/index.html +++ b/book/uml/classDiagrams/associations/navigability/index.html @@ -193,7 +193,7 @@ -

    The arrowhead (not the entire arrow) denotes the navigability. The line denotes the association, as before. So, the navigability (i.e., the arrowhead) is an extra annotation added to an association line.

    For example, both diagrams below show an association between Foo and Bar. But the one on the right shows the navigability as well.

    Navigability can be shown in class diagrams as well as object diagrams.

    According to this object diagram, the given Logic object is associated with and aware of two MineField objects.


    Exercises:

    What does the navigability given by this diagram mean?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    The arrowhead (not the entire arrow) denotes the navigability. The line denotes the association, as before. So, the navigability (i.e., the arrowhead) is an extra annotation added to an association line.

    For example, both diagrams below show an association between Foo and Bar. But the one on the right shows the navigability as well.

    Navigability can be shown in class diagrams as well as object diagrams.

    According to this object diagram, the given Logic object is associated with and aware of two MineField objects.


    Exercises:

    What does the navigability given by this diagram mean?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associations/navigability/index.page-vue-render.js b/book/uml/classDiagrams/associations/navigability/index.page-vue-render.js index 64560e9ce9..ba3c487a5d 100644 --- a/book/uml/classDiagrams/associations/navigability/index.page-vue-render.js +++ b/book/uml/classDiagrams/associations/navigability/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Navigability can be shown in class di with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associations/roles/index.html b/book/uml/classDiagrams/associations/roles/index.html index d503f9dfed..b719636f36 100644 --- a/book/uml/classDiagrams/associations/roles/index.html +++ b/book/uml/classDiagrams/associations/roles/index.html @@ -173,7 +173,7 @@ -

    Association roles are optional to show. They are particularly useful for differentiating among multiple associations between the same two classes.

    In each the three associations between the Flight class and the Airport class given below, the Airport class plays a different role.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Association roles are optional to show. They are particularly useful for differentiating among multiple associations between the same two classes.

    In each the three associations between the Flight class and the Airport class given below, the Airport class plays a different role.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associations/roles/index.page-vue-render.js b/book/uml/classDiagrams/associations/roles/index.page-vue-render.js index 56f72fdd12..92102475c8 100644 --- a/book/uml/classDiagrams/associations/roles/index.page-vue-render.js +++ b/book/uml/classDiagrams/associations/roles/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"roles"}},[_c('span',[_v("Roles with(this){return _c('p',[_c('strong',[_c('em',[_v("Association Role")]),_v(" are used to indicate the role played by the classes in the association.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associations/what/index.html b/book/uml/classDiagrams/associations/what/index.html index 0e327f061a..bfd72afa7a 100644 --- a/book/uml/classDiagrams/associations/what/index.html +++ b/book/uml/classDiagrams/associations/what/index.html @@ -13,7 +13,7 @@ +

    What

    You should use a solid line to show an association between two classes.

    This example shows an association between the Admin class and the Student class:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associations/what/index.page-vue-render.js b/book/uml/classDiagrams/associations/what/index.page-vue-render.js index 48b2a5a90c..11ae183871 100644 --- a/book/uml/classDiagrams/associations/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/associations/what/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associationsAsAttributes/index.html b/book/uml/classDiagrams/associationsAsAttributes/index.html index 82dc1320ce..826521f647 100644 --- a/book/uml/classDiagrams/associationsAsAttributes/index.html +++ b/book/uml/classDiagrams/associationsAsAttributes/index.html @@ -13,7 +13,7 @@

    Tools → UML → Class Diagrams → -

    Associations as attributes

    Associations as attributes

    Can show an association as an attribute

    An association can be shown as an attribute instead of a line.

    Association multiplicities and the default value can be shown as part of the attribute using the following notation. Both are optional.

    name: type [multiplicity] = default value

    The diagram below depicts a multi-player Square Game being played on a board comprising of 100 squares. Each of the squares may be occupied with any number of pieces, each belonging to a certain player.

    A Piece may or may not be on a Square. Note how that association can be replaced by an isOn attribute of the Piece class. The isOn attribute can either be null or hold a reference to a Square object, matching the 0..1 multiplicity of the association it replaces. The default value is null.

    The association that a Board has 100 Squares can be shown in either of these two ways:

    Show each association as either an attribute or a line but not both. A line is preferred as it is easier to spot.

    Diagram (a) given below shows the 'author' association between the Book class and the Person class as a line while (b) shows the same association as an attribute in the Book class. Both are correct and the two are equivalent. But (c) is not correct as it uses both a line and an attribute to show the same association.

    (a)
    (b)
    (c)


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Associations as attributes

    Associations as attributes

    Can show an association as an attribute

    An association can be shown as an attribute instead of a line.

    Association multiplicities and the default value can be shown as part of the attribute using the following notation. Both are optional.

    name: type [multiplicity] = default value

    The diagram below depicts a multi-player Square Game being played on a board comprising of 100 squares. Each of the squares may be occupied with any number of pieces, each belonging to a certain player.

    A Piece may or may not be on a Square. Note how that association can be replaced by an isOn attribute of the Piece class. The isOn attribute can either be null or hold a reference to a Square object, matching the 0..1 multiplicity of the association it replaces. The default value is null.

    The association that a Board has 100 Squares can be shown in either of these two ways:

    Show each association as either an attribute or a line but not both. A line is preferred as it is easier to spot.

    Diagram (a) given below shows the 'author' association between the Book class and the Person class as a line while (b) shows the same association as an attribute in the Book class. Both are correct and the two are equivalent. But (c) is not correct as it uses both a line and an attribute to show the same association.

    (a)
    (b)
    (c)


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associationsAsAttributes/index.page-vue-render.js b/book/uml/classDiagrams/associationsAsAttributes/index.page-vue-render.js index 89a6ccad7b..3d523e977a 100644 --- a/book/uml/classDiagrams/associationsAsAttributes/index.page-vue-render.js +++ b/book/uml/classDiagrams/associationsAsAttributes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"associations-as-attributes"}},[_c('span',[_v("Associations as attributes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#associations-as-attributes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/associationsAsAttributes/what/index.html b/book/uml/classDiagrams/associationsAsAttributes/what/index.html index 6409618570..3d31822089 100644 --- a/book/uml/classDiagrams/associationsAsAttributes/what/index.html +++ b/book/uml/classDiagrams/associationsAsAttributes/what/index.html @@ -13,7 +13,7 @@

    Can show an association as an attribute

    Tools → UML → Class Diagrams → -

    Associations as attributes

    An association can be shown as an attribute instead of a line.

    Association multiplicities and the default value can be shown as part of the attribute using the following notation. Both are optional.

    name: type [multiplicity] = default value

    The diagram below depicts a multi-player Square Game being played on a board comprising of 100 squares. Each of the squares may be occupied with any number of pieces, each belonging to a certain player.

    A Piece may or may not be on a Square. Note how that association can be replaced by an isOn attribute of the Piece class. The isOn attribute can either be null or hold a reference to a Square object, matching the 0..1 multiplicity of the association it replaces. The default value is null.

    The association that a Board has 100 Squares can be shown in either of these two ways:

    Show each association as either an attribute or a line but not both. A line is preferred as it is easier to spot.

    Diagram (a) given below shows the 'author' association between the Book class and the Person class as a line while (b) shows the same association as an attribute in the Book class. Both are correct and the two are equivalent. But (c) is not correct as it uses both a line and an attribute to show the same association.

    (a)
    (b)
    (c)

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Associations as attributes

    An association can be shown as an attribute instead of a line.

    Association multiplicities and the default value can be shown as part of the attribute using the following notation. Both are optional.

    name: type [multiplicity] = default value

    The diagram below depicts a multi-player Square Game being played on a board comprising of 100 squares. Each of the squares may be occupied with any number of pieces, each belonging to a certain player.

    A Piece may or may not be on a Square. Note how that association can be replaced by an isOn attribute of the Piece class. The isOn attribute can either be null or hold a reference to a Square object, matching the 0..1 multiplicity of the association it replaces. The default value is null.

    The association that a Board has 100 Squares can be shown in either of these two ways:

    Show each association as either an attribute or a line but not both. A line is preferred as it is easier to spot.

    Diagram (a) given below shows the 'author' association between the Book class and the Person class as a line while (b) shows the same association as an attribute in the Book class. Both are correct and the two are equivalent. But (c) is not correct as it uses both a line and an attribute to show the same association.

    (a)
    (b)
    (c)

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/associationsAsAttributes/what/index.page-vue-render.js b/book/uml/classDiagrams/associationsAsAttributes/what/index.page-vue-render.js index ecf768f18c..4f9ae82d1f 100644 --- a/book/uml/classDiagrams/associationsAsAttributes/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/associationsAsAttributes/what/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("An association can be shown as an att with(this){return _c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("name: type [multiplicity] = default value")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/classInheritance/index.html b/book/uml/classDiagrams/classInheritance/index.html index 6b3ca2166d..b30d3184e3 100644 --- a/book/uml/classDiagrams/classInheritance/index.html +++ b/book/uml/classDiagrams/classInheritance/index.html @@ -56,7 +56,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/classInheritance/index.page-vue-render.js b/book/uml/classDiagrams/classInheritance/index.page-vue-render.js index fd0c28b64b..6ccc92d905 100644 --- a/book/uml/classDiagrams/classInheritance/index.page-vue-render.js +++ b/book/uml/classDiagrams/classInheritance/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"class-inheritance"}},[_c('span',[_v("Class inheritance")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#class-inheritance","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/classInheritance/what/index.html b/book/uml/classDiagrams/classInheritance/what/index.html index 39ead6b337..ebf73b4573 100644 --- a/book/uml/classDiagrams/classInheritance/what/index.html +++ b/book/uml/classDiagrams/classInheritance/what/index.html @@ -56,7 +56,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/classInheritance/what/index.page-vue-render.js b/book/uml/classDiagrams/classInheritance/what/index.page-vue-render.js index 810cec72c0..2a0d5d2e51 100644 --- a/book/uml/classDiagrams/classInheritance/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/classInheritance/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"inheritance"}},[_c('span',[_v( with(this){return _c('p',[_c('strong',[_v("It does not matter whether the triangle is filled or empty.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/classLevelMembers/index.html b/book/uml/classDiagrams/classLevelMembers/index.html index f4f15e89f6..199f7ce560 100644 --- a/book/uml/classDiagrams/classLevelMembers/index.html +++ b/book/uml/classDiagrams/classLevelMembers/index.html @@ -13,7 +13,7 @@ +

    Class-level members

    Class-level members

    Can interpret class-level members in class diagrams

    In UML class diagrams, underlines denote class-level attributes and methods.

    In the class diagram below, the totalStudents attribute and the getTotalStudents method are class-level.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/classLevelMembers/index.page-vue-render.js b/book/uml/classDiagrams/classLevelMembers/index.page-vue-render.js index 4ad53d4618..6c3d83c6ae 100644 --- a/book/uml/classDiagrams/classLevelMembers/index.page-vue-render.js +++ b/book/uml/classDiagrams/classLevelMembers/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"class-level-members"}},[_c('span',[_v("Class-level members")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#class-level-members","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/classLevelMembers/what/index.html b/book/uml/classDiagrams/classLevelMembers/what/index.html index 5779a9e5e1..d2c3c6dca6 100644 --- a/book/uml/classDiagrams/classLevelMembers/what/index.html +++ b/book/uml/classDiagrams/classLevelMembers/what/index.html @@ -13,7 +13,7 @@ +

    Class-level members

    In UML class diagrams, underlines denote class-level attributes and methods.

    In the class diagram below, the totalStudents attribute and the getTotalStudents method are class-level.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/classLevelMembers/what/index.page-vue-render.js b/book/uml/classDiagrams/classLevelMembers/what/index.page-vue-render.js index fb31524692..1af85c75e4 100644 --- a/book/uml/classDiagrams/classLevelMembers/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/classLevelMembers/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"class-level-members"}},[_c('sp with(this){return _c('p',[_v("In UML class diagrams, "),_c('strong',[_v("underlines denote class-level attributes and methods.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/classes/index.html b/book/uml/classDiagrams/classes/index.html index d190c9c974..0fc1175795 100644 --- a/book/uml/classDiagrams/classes/index.html +++ b/book/uml/classDiagrams/classes/index.html @@ -13,7 +13,7 @@

    Tools → UML → Class Diagrams → -

    Classes

    What

    Can draw UML classes

    The basic UML notations used to represent a class:

    A Table class shown in UML notation:

    The equivalent code


    The 'Operations' compartment and/or the 'Attributes' compartment may be omitted if such details are not important for the task at hand. Similarly, some attributes/operations can be omitted if not relevant to the purpose of the diagram. 'Attributes' always appear above the 'Operations' compartment. All operations should be in one compartment rather than each operation in a separate compartment. Same goes for attributes.

    The visibility of attributes and operations is used to indicate the level of access allowed for each attribute or operation. The types of visibility and their exact meanings depend on the programming language used. Here are some common visibilities and how they are indicated in a class diagram:

    • + : public
    • - : private
    • # : protected
    • ~ : package private

    How visibilities map to programming language features


    Table class with visibilities shown:

    The equivalent code


    There is no default visibility in UML. If a class diagram does not show the visibility of a , it simply means the visibility is unspecified (for reasons such as the visibility not being decided yet or it being not important to the purpose of the diagram).

    Generic classes can be shown as given below. The notation format is shown on the left, followed by two examples.


    Exercises:

    Which classes are correct?


    Draw Car class



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Classes

    What

    Can draw UML classes

    The basic UML notations used to represent a class:

    A Table class shown in UML notation:

    The equivalent code


    The 'Operations' compartment and/or the 'Attributes' compartment may be omitted if such details are not important for the task at hand. Similarly, some attributes/operations can be omitted if not relevant to the purpose of the diagram. 'Attributes' always appear above the 'Operations' compartment. All operations should be in one compartment rather than each operation in a separate compartment. Same goes for attributes.

    The visibility of attributes and operations is used to indicate the level of access allowed for each attribute or operation. The types of visibility and their exact meanings depend on the programming language used. Here are some common visibilities and how they are indicated in a class diagram:

    • + : public
    • - : private
    • # : protected
    • ~ : package private

    How visibilities map to programming language features


    Table class with visibilities shown:

    The equivalent code


    There is no default visibility in UML. If a class diagram does not show the visibility of a , it simply means the visibility is unspecified (for reasons such as the visibility not being decided yet or it being not important to the purpose of the diagram).

    Generic classes can be shown as given below. The notation format is shown on the left, followed by two examples.


    Exercises:

    Which classes are correct?


    Draw Car class



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/classes/index.page-vue-render.js b/book/uml/classDiagrams/classes/index.page-vue-render.js index 640a70a0bc..a562d1f4bb 100644 --- a/book/uml/classDiagrams/classes/index.page-vue-render.js +++ b/book/uml/classDiagrams/classes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"classes"}},[_c('span',[_v("Classes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#classes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/classes/what/index.html b/book/uml/classDiagrams/classes/what/index.html index c1d2fce311..b1dd51bf04 100644 --- a/book/uml/classDiagrams/classes/what/index.html +++ b/book/uml/classDiagrams/classes/what/index.html @@ -13,7 +13,7 @@

    Can draw UML classes

    Tools → UML → Class Diagrams → Classes → -

    What

    The basic UML notations used to represent a class:

    A Table class shown in UML notation:

    The equivalent code


    The 'Operations' compartment and/or the 'Attributes' compartment may be omitted if such details are not important for the task at hand. Similarly, some attributes/operations can be omitted if not relevant to the purpose of the diagram. 'Attributes' always appear above the 'Operations' compartment. All operations should be in one compartment rather than each operation in a separate compartment. Same goes for attributes.

    The visibility of attributes and operations is used to indicate the level of access allowed for each attribute or operation. The types of visibility and their exact meanings depend on the programming language used. Here are some common visibilities and how they are indicated in a class diagram:

    • + : public
    • - : private
    • # : protected
    • ~ : package private

    How visibilities map to programming language features


    Table class with visibilities shown:

    The equivalent code


    There is no default visibility in UML. If a class diagram does not show the visibility of a , it simply means the visibility is unspecified (for reasons such as the visibility not being decided yet or it being not important to the purpose of the diagram).

    Generic classes can be shown as given below. The notation format is shown on the left, followed by two examples.


    Exercises:

    Which classes are correct?


    Draw Car class


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    What

    The basic UML notations used to represent a class:

    A Table class shown in UML notation:

    The equivalent code


    The 'Operations' compartment and/or the 'Attributes' compartment may be omitted if such details are not important for the task at hand. Similarly, some attributes/operations can be omitted if not relevant to the purpose of the diagram. 'Attributes' always appear above the 'Operations' compartment. All operations should be in one compartment rather than each operation in a separate compartment. Same goes for attributes.

    The visibility of attributes and operations is used to indicate the level of access allowed for each attribute or operation. The types of visibility and their exact meanings depend on the programming language used. Here are some common visibilities and how they are indicated in a class diagram:

    • + : public
    • - : private
    • # : protected
    • ~ : package private

    How visibilities map to programming language features


    Table class with visibilities shown:

    The equivalent code


    There is no default visibility in UML. If a class diagram does not show the visibility of a , it simply means the visibility is unspecified (for reasons such as the visibility not being decided yet or it being not important to the purpose of the diagram).

    Generic classes can be shown as given below. The notation format is shown on the left, followed by two examples.


    Exercises:

    Which classes are correct?


    Draw Car class


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/classes/what/index.page-vue-render.js b/book/uml/classDiagrams/classes/what/index.page-vue-render.js index 41e5d53284..4dfae22cc9 100644 --- a/book/uml/classDiagrams/classes/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/classes/what/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Generic classes can be shown as given with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/combine/basic/index.html b/book/uml/classDiagrams/combine/basic/index.html index 2e38864b4c..eee79774e7 100644 --- a/book/uml/classDiagrams/combine/basic/index.html +++ b/book/uml/classDiagrams/combine/basic/index.html @@ -13,7 +13,7 @@ +

    Basic


    Exercises:

    Class Diagram for code


    Implement Class Diagram


    Draw an Object Diagram for the Class Diagram (Person-Guardian)


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/combine/basic/index.page-vue-render.js b/book/uml/classDiagrams/combine/basic/index.page-vue-render.js index 93b9c002e1..6494b837f9 100644 --- a/book/uml/classDiagrams/combine/basic/index.page-vue-render.js +++ b/book/uml/classDiagrams/combine/basic/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"basic"}},[_c('span',[_v("Basic with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/combine/index.html b/book/uml/classDiagrams/combine/index.html index c36ca37d68..f93f472854 100644 --- a/book/uml/classDiagrams/combine/index.html +++ b/book/uml/classDiagrams/combine/index.html @@ -13,7 +13,7 @@ +

    Combine

    Basic

    Can combine different basic aspects of class diagrams


    Exercises:

    Class Diagram for code


    Implement Class Diagram


    Draw an Object Diagram for the Class Diagram (Person-Guardian)



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/combine/index.page-vue-render.js b/book/uml/classDiagrams/combine/index.page-vue-render.js index 6b7b6bb16d..ee5f66b011 100644 --- a/book/uml/classDiagrams/combine/index.page-vue-render.js +++ b/book/uml/classDiagrams/combine/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"combine"}},[_c('span',[_v("Combine")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#combine","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/composition/index.html b/book/uml/classDiagrams/composition/index.html index e63e0b6664..8434255c65 100644 --- a/book/uml/classDiagrams/composition/index.html +++ b/book/uml/classDiagrams/composition/index.html @@ -13,7 +13,7 @@ +

    Composition

    Composition

    Can interpret composition in class diagrams

    UML uses a solid diamond symbol to denote composition.

    Notation:

    A Book is composed of Chapter objects. As a result, when the Book object is destroyed, its Chapter objects are destroyed too.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/composition/index.page-vue-render.js b/book/uml/classDiagrams/composition/index.page-vue-render.js index 2943d69869..4783bfe132 100644 --- a/book/uml/classDiagrams/composition/index.page-vue-render.js +++ b/book/uml/classDiagrams/composition/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"composition"}},[_c('span',[_v("Composition")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#composition","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/composition/what/index.html b/book/uml/classDiagrams/composition/what/index.html index 95801dd0f9..e901088aaf 100644 --- a/book/uml/classDiagrams/composition/what/index.html +++ b/book/uml/classDiagrams/composition/what/index.html @@ -13,7 +13,7 @@ +

    Composition

    UML uses a solid diamond symbol to denote composition.

    Notation:

    A Book is composed of Chapter objects. As a result, when the Book object is destroyed, its Chapter objects are destroyed too.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/composition/what/index.page-vue-render.js b/book/uml/classDiagrams/composition/what/index.page-vue-render.js index 206226f09b..a4104cc1cc 100644 --- a/book/uml/classDiagrams/composition/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/composition/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"composition"}},[_c('span',[_v( with(this){return _c('p',[_c('strong',[_v("UML uses a solid diamond symbol to denote composition.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/dependencies/index.html b/book/uml/classDiagrams/dependencies/index.html index c75e5333fc..95cafd1936 100644 --- a/book/uml/classDiagrams/dependencies/index.html +++ b/book/uml/classDiagrams/dependencies/index.html @@ -14,7 +14,7 @@

    Tools → UML → Class Diagrams →

    Dependencies

    Dependencies

    Can use dependencies in a class diagram

    UML uses a dashed arrow to show dependencies.

    Two examples of dependencies:

    Dependencies vs associations:

    • An association is a relationship resulting from one object keeping a reference to another object (i.e., storing an object in an instance variable). While such a relationship forms a dependency, we need not show that as a dependency arrow in the class diagram if the association is already indicated in the diagram. That is, showing a dependency arrow does not add any value to the diagram.
      -Similarly, an inheritance results in a dependency from the child class to the parent class but we don't show it as a dependency arrow either, for the same reason as above.
    • Use a dependency arrow to indicate a dependency only if that dependency is not already captured by the diagram in another way (for instance, as an association or an inheritance) e.g., class Foo accessing a constant in Bar but there is no association/inheritance from Foo to Bar.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Similarly, an inheritance results in a dependency from the child class to the parent class but we don't show it as a dependency arrow either, for the same reason as above.
  • Use a dependency arrow to indicate a dependency only if that dependency is not already captured by the diagram in another way (for instance, as an association or an inheritance) e.g., class Foo accessing a constant in Bar but there is no association/inheritance from Foo to Bar.

  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/dependencies/index.page-vue-render.js b/book/uml/classDiagrams/dependencies/index.page-vue-render.js index 53036181b5..76b58a225b 100644 --- a/book/uml/classDiagrams/dependencies/index.page-vue-render.js +++ b/book/uml/classDiagrams/dependencies/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"dependencies"}},[_c('span',[_v("Dependencies")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dependencies","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/dependencies/what/index.html b/book/uml/classDiagrams/dependencies/what/index.html index 8b3c2f44d9..f1fcc703ad 100644 --- a/book/uml/classDiagrams/dependencies/what/index.html +++ b/book/uml/classDiagrams/dependencies/what/index.html @@ -14,7 +14,7 @@

    Can use dependencies in a class diagram

    Tools → UML → Class Diagrams → Dependencies →

    Dependencies

    UML uses a dashed arrow to show dependencies.

    Two examples of dependencies:

    Dependencies vs associations:

    • An association is a relationship resulting from one object keeping a reference to another object (i.e., storing an object in an instance variable). While such a relationship forms a dependency, we need not show that as a dependency arrow in the class diagram if the association is already indicated in the diagram. That is, showing a dependency arrow does not add any value to the diagram.
      -Similarly, an inheritance results in a dependency from the child class to the parent class but we don't show it as a dependency arrow either, for the same reason as above.
    • Use a dependency arrow to indicate a dependency only if that dependency is not already captured by the diagram in another way (for instance, as an association or an inheritance) e.g., class Foo accessing a constant in Bar but there is no association/inheritance from Foo to Bar.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Similarly, an inheritance results in a dependency from the child class to the parent class but we don't show it as a dependency arrow either, for the same reason as above.
  • Use a dependency arrow to indicate a dependency only if that dependency is not already captured by the diagram in another way (for instance, as an association or an inheritance) e.g., class Foo accessing a constant in Bar but there is no association/inheritance from Foo to Bar.
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/dependencies/what/index.page-vue-render.js b/book/uml/classDiagrams/dependencies/what/index.page-vue-render.js index 7bd7ba29f6..58aada8d1a 100644 --- a/book/uml/classDiagrams/dependencies/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/dependencies/what/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('strong',[_v("Dependencies vs associations:")])])} with(this){return _c('ul',[_c('li',[_v("An association is a relationship resulting from one object keeping a reference to another object (i.e., storing an object in an instance variable). While such a relationship forms a "),_c('em',[_v("dependency")]),_v(", we need not show that as a dependency arrow in the class diagram if the association is already indicated in the diagram. That is, showing a dependency arrow does not add any value to the diagram."),_c('br'),_v("\nSimilarly, an inheritance results in a dependency from the child class to the parent class but we don't show it as a dependency arrow either, for the same reason as above.")]),_v(" "),_c('li',[_c('strong',[_v("Use a dependency arrow to indicate a dependency only if that dependency is not already captured by the diagram in another way")]),_v(" (for instance, as an association or an inheritance) e.g., class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Foo")]),_v(" accessing a constant in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bar")]),_v(" but there is no association/inheritance from "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Foo")]),_v(" to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Bar")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/enumerations/index.html b/book/uml/classDiagrams/enumerations/index.html index a41d806d23..27e15d1263 100644 --- a/book/uml/classDiagrams/enumerations/index.html +++ b/book/uml/classDiagrams/enumerations/index.html @@ -13,7 +13,7 @@ +

    Enumerations

    What

    Can interpret enumerations in class diagrams

    Notation:

    In the class diagram below, there are two enumerations in use:


    Exercises:

    Define WeekDay Enum



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/enumerations/index.page-vue-render.js b/book/uml/classDiagrams/enumerations/index.page-vue-render.js index c09f333f4b..9444381f2a 100644 --- a/book/uml/classDiagrams/enumerations/index.page-vue-render.js +++ b/book/uml/classDiagrams/enumerations/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"enumerations"}},[_c('span',[_v("Enumerations")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#enumerations","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/enumerations/what/index.html b/book/uml/classDiagrams/enumerations/what/index.html index c0274642cd..039baed186 100644 --- a/book/uml/classDiagrams/enumerations/what/index.html +++ b/book/uml/classDiagrams/enumerations/what/index.html @@ -13,7 +13,7 @@ +

    What

    Notation:

    In the class diagram below, there are two enumerations in use:


    Exercises:

    Define WeekDay Enum


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/enumerations/what/index.page-vue-render.js b/book/uml/classDiagrams/enumerations/what/index.page-vue-render.js index b6a69d3039..26fa9fb021 100644 --- a/book/uml/classDiagrams/enumerations/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/enumerations/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/index.html b/book/uml/classDiagrams/index.html index c26f3cbba8..6866e067fb 100644 --- a/book/uml/classDiagrams/index.html +++ b/book/uml/classDiagrams/index.html @@ -397,7 +397,7 @@ -


    Interfaces

    Interfaces

    Can interpret interfaces in class diagrams

    An interface is shown similar to a class with an additional keyword <<interface>>. When a class implements an interface, it is shown similar to class inheritance except a dashed line is used instead of a solid line.

    The AcademicStaff and the AdminStaff classes implement the SalariedStaff interface.



    Abstract classes

    What

    Can interpret abstract classes in class diagrams

    You can use italics or {abstract} (preferred) keyword to denote abstract classes/methods.

    Example:



    Combine

    Basic

    Can combine different basic aspects of class diagrams


    Exercises:

    Class Diagram for code


    Implement Class Diagram


    Draw an Object Diagram for the Class Diagram (Person-Guardian)




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Interfaces

    Interfaces

    Can interpret interfaces in class diagrams

    An interface is shown similar to a class with an additional keyword <<interface>>. When a class implements an interface, it is shown similar to class inheritance except a dashed line is used instead of a solid line.

    The AcademicStaff and the AdminStaff classes implement the SalariedStaff interface.



    Abstract classes

    What

    Can interpret abstract classes in class diagrams

    You can use italics or {abstract} (preferred) keyword to denote abstract classes/methods.

    Example:



    Combine

    Basic

    Can combine different basic aspects of class diagrams


    Exercises:

    Class Diagram for code


    Implement Class Diagram


    Draw an Object Diagram for the Class Diagram (Person-Guardian)




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/index.page-vue-render.js b/book/uml/classDiagrams/index.page-vue-render.js index 8515996cd5..c4a8eed989 100644 --- a/book/uml/classDiagrams/index.page-vue-render.js +++ b/book/uml/classDiagrams/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"class-diagrams"}},[_c('span',[_v("Class diagrams")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#class-diagrams","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/interfaces/index.html b/book/uml/classDiagrams/interfaces/index.html index d99a85b893..5058609ba1 100644 --- a/book/uml/classDiagrams/interfaces/index.html +++ b/book/uml/classDiagrams/interfaces/index.html @@ -13,7 +13,7 @@ +

    Interfaces

    Interfaces

    Can interpret interfaces in class diagrams

    An interface is shown similar to a class with an additional keyword <<interface>>. When a class implements an interface, it is shown similar to class inheritance except a dashed line is used instead of a solid line.

    The AcademicStaff and the AdminStaff classes implement the SalariedStaff interface.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/interfaces/index.page-vue-render.js b/book/uml/classDiagrams/interfaces/index.page-vue-render.js index f4cf7b39d7..a165222abd 100644 --- a/book/uml/classDiagrams/interfaces/index.page-vue-render.js +++ b/book/uml/classDiagrams/interfaces/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"interfaces"}},[_c('span',[_v("Interfaces")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#interfaces","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/interfaces/what/index.html b/book/uml/classDiagrams/interfaces/what/index.html index f782dc722a..f462f0c496 100644 --- a/book/uml/classDiagrams/interfaces/what/index.html +++ b/book/uml/classDiagrams/interfaces/what/index.html @@ -13,7 +13,7 @@ +

    Interfaces

    An interface is shown similar to a class with an additional keyword <<interface>>. When a class implements an interface, it is shown similar to class inheritance except a dashed line is used instead of a solid line.

    The AcademicStaff and the AdminStaff classes implement the SalariedStaff interface.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/interfaces/what/index.page-vue-render.js b/book/uml/classDiagrams/interfaces/what/index.page-vue-render.js index b61b41f544..997eb2ac61 100644 --- a/book/uml/classDiagrams/interfaces/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/interfaces/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"interfaces"}},[_c('span',[_v(" with(this){return _c('p',[_c('strong',[_v("An interface is shown similar to a class with an additional keyword "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(". When a class implements an interface, it is shown similar to class inheritance except a dashed line is used instead of a solid line.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/introduction/index.html b/book/uml/classDiagrams/introduction/index.html index 397eff85e8..6e3fc789df 100644 --- a/book/uml/classDiagrams/introduction/index.html +++ b/book/uml/classDiagrams/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    What

    Can explain/identify class diagrams

    UML class diagrams describe the structure (but not the behavior) of an OOP solution. These are possibly the most often used diagrams in the industry and are an indispensable tool for an OO programmer.

    An example class diagram:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/introduction/index.page-vue-render.js b/book/uml/classDiagrams/introduction/index.page-vue-render.js index c66072d2a9..3759522f26 100644 --- a/book/uml/classDiagrams/introduction/index.page-vue-render.js +++ b/book/uml/classDiagrams/introduction/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"introduction"}},[_c('span',[_v("Introduction")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#introduction","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/classDiagrams/introduction/what/index.html b/book/uml/classDiagrams/introduction/what/index.html index 544ff97dc3..41ef82c525 100644 --- a/book/uml/classDiagrams/introduction/what/index.html +++ b/book/uml/classDiagrams/introduction/what/index.html @@ -13,7 +13,7 @@ +

    What

    UML class diagrams describe the structure (but not the behavior) of an OOP solution. These are possibly the most often used diagrams in the industry and are an indispensable tool for an OO programmer.

    An example class diagram:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/classDiagrams/introduction/what/index.page-vue-render.js b/book/uml/classDiagrams/introduction/what/index.page-vue-render.js index 08147ed609..e4145072e5 100644 --- a/book/uml/classDiagrams/introduction/what/index.page-vue-render.js +++ b/book/uml/classDiagrams/introduction/what/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"what"}},[_c('span',[_v("What") with(this){return _c('p',[_c('strong',[_v("UML "),_c('em',[_v("class diagrams")]),_v(" describe the structure (but not the behavior) of an OOP solution.")]),_v(" These are possibly the most often used diagrams in the industry and are an indispensable tool for an OO programmer.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/index.html b/book/uml/index.html index 908147cb69..323de81898 100644 --- a/book/uml/index.html +++ b/book/uml/index.html @@ -529,7 +529,7 @@

    Alternative paths

    Can interpret sequence diagrams with alternative paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.


    Optional paths

    Can interpret sequence diagrams with optional paths

    UML uses opt frames to indicate optional paths.

    Notation:

    Logic#markCellAt(...) calls Timer#start() only if it is the first move of the player.


    Parallel paths

    Can interpret sequence diagrams with parallel paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.


    Reference frames

    Can interpret sequence diagrams with reference frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.


    Minimal notation

    Can interpret sequence diagrams with minimal notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).


    Calls to static methods

    Can show calls to static methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:



    Object diagrams

    Introduction

    Can explain/identify object diagrams

    An object diagram shows an object structure at a given point of time.

    An example object diagram:


    Objects

    Can draw UML objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:


    Exercises:

    Draw Book object



    Associations

    Can interpret simple associations among objects

    A solid line indicates an association between two objects.

    An example object diagram showing two associations:



    Activity diagrams

    Introduction

    Introduction

    Can explain activity diagrams

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]



    Basic notations

    Linear paths

    Can interpret linear paths in activity diagrams

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?



    Alternate paths

    Can interpret alternate paths in activity diagrams

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?



    Parallel paths

    Can interpret parallel paths in activity diagrams

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?



    Rakes

    Can use rakes in activity diagrams

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.


    Swimlanes

    Can explain swimlanes in activity diagrams

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:




    Notes

    Notes

    Can use UML notes

    UML notes can augment UML diagrams with additional information. These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.

    Example:


    Constraints

    Can specify constraints in UML diagrams

    A constraint can be given inside a note, within curly braces. Natural language or a formal notation such as OCL (Object Constraint Language) may be used to specify constraints.

    Example:



    Miscellaneous

    Object versus class diagrams

    Can distinguish between class diagrams and object diagrams

    Compared to the notation for class diagrams, object diagrams differ in the following ways:

    • Show objects instead of classes:
      • Instance name may be shown
      • There is a : before the class name
      • Instance and class names are underlined
    • Methods are omitted
    • Multiplicities are omitted. Reason: an association line in an object diagram represents a connection to exactly one object (i.e., the multiplicity is always 1).

    Furthermore, multiple object diagrams can correspond to a single class diagram.

    Both object diagrams are derived from the same class diagram shown earlier. In other words, each of these object diagrams shows ‘an instance of’ the same class diagram.

    When the class diagram has an inheritance relationship, the object diagram should show either an object of the parent class or the child class, but not both.

    Suppose Employee is a child class of the Person class. The class diagram will be as follows:

    Now, how do you show an Employee object named jake?

    • This is not correct, as there should be only one object.

    • This is OK.

    • This is OK, as jake is a Person too. -That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/index.page-vue-render.js b/book/uml/index.page-vue-render.js index 34018827a2..c5bf55cb25 100644 --- a/book/uml/index.page-vue-render.js +++ b/book/uml/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"uml"}},[_c('span',[_v("UML")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#uml","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/miscellaneous/index.html b/book/uml/miscellaneous/index.html index 1cafc5cefc..b3795a7c0e 100644 --- a/book/uml/miscellaneous/index.html +++ b/book/uml/miscellaneous/index.html @@ -15,7 +15,7 @@

    Tools → UML →

    Miscellaneous

    Object versus class diagrams

    Can distinguish between class diagrams and object diagrams

    Compared to the notation for class diagrams, object diagrams differ in the following ways:

    • Show objects instead of classes:
      • Instance name may be shown
      • There is a : before the class name
      • Instance and class names are underlined
    • Methods are omitted
    • Multiplicities are omitted. Reason: an association line in an object diagram represents a connection to exactly one object (i.e., the multiplicity is always 1).

    Furthermore, multiple object diagrams can correspond to a single class diagram.

    Both object diagrams are derived from the same class diagram shown earlier. In other words, each of these object diagrams shows ‘an instance of’ the same class diagram.

    When the class diagram has an inheritance relationship, the object diagram should show either an object of the parent class or the child class, but not both.

    Suppose Employee is a child class of the Person class. The class diagram will be as follows:

    Now, how do you show an Employee object named jake?

    • This is not correct, as there should be only one object.

    • This is OK.

    • This is OK, as jake is a Person too. -That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/miscellaneous/index.page-vue-render.js b/book/uml/miscellaneous/index.page-vue-render.js index a6aed58ba2..8934d6473b 100644 --- a/book/uml/miscellaneous/index.page-vue-render.js +++ b/book/uml/miscellaneous/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"miscellaneous"}},[_c('span',[_v("Miscellaneous")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#miscellaneous","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/miscellaneous/objectVsClassDiagrams/index.html b/book/uml/miscellaneous/objectVsClassDiagrams/index.html index bcfd22e5e2..8f33af4c18 100644 --- a/book/uml/miscellaneous/objectVsClassDiagrams/index.html +++ b/book/uml/miscellaneous/objectVsClassDiagrams/index.html @@ -15,7 +15,7 @@

    Can distinguish between class diagrams and object diagrams

    Tools → UML →

    Object versus class diagrams

    Compared to the notation for class diagrams, object diagrams differ in the following ways:

    • Show objects instead of classes:
      • Instance name may be shown
      • There is a : before the class name
      • Instance and class names are underlined
    • Methods are omitted
    • Multiplicities are omitted. Reason: an association line in an object diagram represents a connection to exactly one object (i.e., the multiplicity is always 1).

    Furthermore, multiple object diagrams can correspond to a single class diagram.

    Both object diagrams are derived from the same class diagram shown earlier. In other words, each of these object diagrams shows ‘an instance of’ the same class diagram.

    When the class diagram has an inheritance relationship, the object diagram should show either an object of the parent class or the child class, but not both.

    Suppose Employee is a child class of the Person class. The class diagram will be as follows:

    Now, how do you show an Employee object named jake?

    • This is not correct, as there should be only one object.

    • This is OK.

    • This is OK, as jake is a Person too. -That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/miscellaneous/objectVsClassDiagrams/index.page-vue-render.js b/book/uml/miscellaneous/objectVsClassDiagrams/index.page-vue-render.js index f7bbd7d66a..06a5eed2a6 100644 --- a/book/uml/miscellaneous/objectVsClassDiagrams/index.page-vue-render.js +++ b/book/uml/miscellaneous/objectVsClassDiagrams/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Association labels/roles "),_c('em',[ with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/notes/constraints/index.html b/book/uml/notes/constraints/index.html index b2a821f178..16b09695b4 100644 --- a/book/uml/notes/constraints/index.html +++ b/book/uml/notes/constraints/index.html @@ -13,7 +13,7 @@ +

    Constraints

    A constraint can be given inside a note, within curly braces. Natural language or a formal notation such as OCL (Object Constraint Language) may be used to specify constraints.

    Example:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/notes/constraints/index.page-vue-render.js b/book/uml/notes/constraints/index.page-vue-render.js index e290c8fd38..57047bf1d6 100644 --- a/book/uml/notes/constraints/index.page-vue-render.js +++ b/book/uml/notes/constraints/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"constraints"}},[_c('span',[_v( with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("constraint")]),_v(" can be given inside a note, within curly braces")]),_v(". Natural language or a formal notation such as "),_c('em',[_v("OCL (Object Constraint Language)")]),_v(" may be used to specify constraints.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/notes/index.html b/book/uml/notes/index.html index 65cd3c11c8..7ff5a1df34 100644 --- a/book/uml/notes/index.html +++ b/book/uml/notes/index.html @@ -13,7 +13,7 @@

    Tools → UML → -

    Notes

    Notes

    Can use UML notes

    UML notes can augment UML diagrams with additional information. These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.

    Example:


    Constraints

    Can specify constraints in UML diagrams

    A constraint can be given inside a note, within curly braces. Natural language or a formal notation such as OCL (Object Constraint Language) may be used to specify constraints.

    Example:


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Notes

    Notes

    Can use UML notes

    UML notes can augment UML diagrams with additional information. These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.

    Example:


    Constraints

    Can specify constraints in UML diagrams

    A constraint can be given inside a note, within curly braces. Natural language or a formal notation such as OCL (Object Constraint Language) may be used to specify constraints.

    Example:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/notes/index.page-vue-render.js b/book/uml/notes/index.page-vue-render.js index 51c788f80f..84f7e91fbc 100644 --- a/book/uml/notes/index.page-vue-render.js +++ b/book/uml/notes/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"notes"}},[_c('span',[_v("Notes")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#notes","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/notes/notes/index.html b/book/uml/notes/notes/index.html index fff20e0172..97f4381d4d 100644 --- a/book/uml/notes/notes/index.html +++ b/book/uml/notes/notes/index.html @@ -13,7 +13,7 @@ +

    Notes

    UML notes can augment UML diagrams with additional information. These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.

    Example:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/notes/notes/index.page-vue-render.js b/book/uml/notes/notes/index.page-vue-render.js index 0b3a7d851e..a1f41bc824 100644 --- a/book/uml/notes/notes/index.page-vue-render.js +++ b/book/uml/notes/notes/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"notes"}},[_c('span',[_v("Notes with(this){return _c('p',[_c('strong',[_v("UML notes can augment UML diagrams with additional information.")]),_v(" These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/objectDiagrams/associations/index.html b/book/uml/objectDiagrams/associations/index.html index 5d41f28a52..1f440b39ad 100644 --- a/book/uml/objectDiagrams/associations/index.html +++ b/book/uml/objectDiagrams/associations/index.html @@ -13,7 +13,7 @@ +

    Associations

    A solid line indicates an association between two objects.

    An example object diagram showing two associations:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/objectDiagrams/associations/index.page-vue-render.js b/book/uml/objectDiagrams/associations/index.page-vue-render.js index c7deacfb22..b254045360 100644 --- a/book/uml/objectDiagrams/associations/index.page-vue-render.js +++ b/book/uml/objectDiagrams/associations/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"associations"}},[_c('span',[_v("Associations")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#associations","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/objectDiagrams/index.html b/book/uml/objectDiagrams/index.html index a782b2cb5a..1dda2aab32 100644 --- a/book/uml/objectDiagrams/index.html +++ b/book/uml/objectDiagrams/index.html @@ -13,7 +13,7 @@

    Tools → UML → -

    Object diagrams

    Introduction

    Can explain/identify object diagrams

    An object diagram shows an object structure at a given point of time.

    An example object diagram:


    Objects

    Can draw UML objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:


    Exercises:

    Draw Book object



    Associations

    Can interpret simple associations among objects

    A solid line indicates an association between two objects.

    An example object diagram showing two associations:


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Object diagrams

    Introduction

    Can explain/identify object diagrams

    An object diagram shows an object structure at a given point of time.

    An example object diagram:


    Objects

    Can draw UML objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:


    Exercises:

    Draw Book object



    Associations

    Can interpret simple associations among objects

    A solid line indicates an association between two objects.

    An example object diagram showing two associations:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/objectDiagrams/index.page-vue-render.js b/book/uml/objectDiagrams/index.page-vue-render.js index df5c419033..a74508b468 100644 --- a/book/uml/objectDiagrams/index.page-vue-render.js +++ b/book/uml/objectDiagrams/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"object-diagrams"}},[_c('span',[_v("Object diagrams")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#object-diagrams","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/objectDiagrams/introduction/index.html b/book/uml/objectDiagrams/introduction/index.html index c59fdc6dee..e4af58d5d8 100644 --- a/book/uml/objectDiagrams/introduction/index.html +++ b/book/uml/objectDiagrams/introduction/index.html @@ -13,7 +13,7 @@ +

    Introduction

    An object diagram shows an object structure at a given point of time.

    An example object diagram:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/objectDiagrams/introduction/index.page-vue-render.js b/book/uml/objectDiagrams/introduction/index.page-vue-render.js index 0b1b49c28e..914f951c34 100644 --- a/book/uml/objectDiagrams/introduction/index.page-vue-render.js +++ b/book/uml/objectDiagrams/introduction/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v with(this){return _c('p',[_c('strong',[_v("An object diagram shows an object structure at a given point of time.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/objectDiagrams/objects/index.html b/book/uml/objectDiagrams/objects/index.html index 9c00bd5bcb..abf6c93385 100644 --- a/book/uml/objectDiagrams/objects/index.html +++ b/book/uml/objectDiagrams/objects/index.html @@ -13,7 +13,7 @@

    Can draw UML objects

    Tools → UML → Object Diagrams → -

    Objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:


    Exercises:

    Draw Book object


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:


    Exercises:

    Draw Book object


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/objectDiagrams/objects/index.page-vue-render.js b/book/uml/objectDiagrams/objects/index.page-vue-render.js index 6869ba0bff..5beb55587c 100644 --- a/book/uml/objectDiagrams/objects/index.page-vue-render.js +++ b/book/uml/objectDiagrams/objects/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('ul',[_c('li',[_v("The class name and object name are under with(this){return _c('h5',{attrs:{"id":"exercises"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-question-sign",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-ok-sign",attrs:{"aria-hidden":"true"}})]),_v(" Exercises:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/alternativePaths/index.html b/book/uml/sequenceDiagrams/alternativePaths/index.html index 90d6e5ced5..4a1976e15d 100644 --- a/book/uml/sequenceDiagrams/alternativePaths/index.html +++ b/book/uml/sequenceDiagrams/alternativePaths/index.html @@ -13,7 +13,7 @@

    Can interpret sequence diagrams with alternative paths

    Tools → UML → Sequence Diagrams → -

    Alternative paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Alternative paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/alternativePaths/index.page-vue-render.js b/book/uml/sequenceDiagrams/alternativePaths/index.page-vue-render.js index 3b2ae18a2b..b773e8baeb 100644 --- a/book/uml/sequenceDiagrams/alternativePaths/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/alternativePaths/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("UML uses "),_c('code',{pre:true,attrs with(this){return _c('p',[_c('strong',[_v("No more than one alternative partitions be executed")]),_v(" in an "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("alt")]),_v(" frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/basic/index.html b/book/uml/sequenceDiagrams/basic/index.html index b133483c33..e8c21e32bd 100644 --- a/book/uml/sequenceDiagrams/basic/index.html +++ b/book/uml/sequenceDiagrams/basic/index.html @@ -13,7 +13,7 @@

    Can interpret sequence diagrams with basic notation

    Tools → UML → Sequence Diagrams → -

    Basic

    Notation:

    This sequence diagram shows some interactions between a human user and the Text UI of a Minesweeper game.

    The player runs the newgame action on the TextUi object which results in the TextUi showing the minefield to the player. Then, the player runs the clear x y command; in response, the TextUi object shows the updated minefield.

    The :TextUi in the above example denotes an unnamed instance of the class TextUi. If there were two instances of TextUi in the diagram, they can be distinguished by naming them e.g. TextUi1:TextUi and TextUi2:TextUi.

    Arrows representing method calls should be solid arrows while those representing method returns should be dashed arrows.

    Note that unlike in object diagrams, the class/object name is not underlined in sequence diagrams.

    The arrowhead style depends on the type of method call. Arrows showing synchronous (i.e., the caller method is blocked from doing anything else until the called method returns) should use filled arrowheads (e.g., ). Most method calls (e.g., normal Java method calls) are synchronous. Asynchronous method calls (i.e., the caller method does not have to wait till the called method returns) are shown using lined arrowheads (e.g., ). As the latter is out of scope for this textbook, all sequence diagram arrow heads you encournter in this textbook will be of the first type.

    [Common notation error] Activation bar too long: The activation bar of a method cannot start before the method call arrives and a method cannot remain active after the method has returned. In the two sequence diagrams below, the one on the left commits this error because the activation bar starts before the method Foo#xyz() is called and remains active after the method returns.

    [Common notation error] Broken activation bar: The activation bar should remain unbroken while the method is being executed, from the point the method is called until the method returns. In the two sequence diagrams below, the one on the left commits this error because the activation bar for the method Foo#abc() is broken in the middle.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Basic

    Notation:

    This sequence diagram shows some interactions between a human user and the Text UI of a Minesweeper game.

    The player runs the newgame action on the TextUi object which results in the TextUi showing the minefield to the player. Then, the player runs the clear x y command; in response, the TextUi object shows the updated minefield.

    The :TextUi in the above example denotes an unnamed instance of the class TextUi. If there were two instances of TextUi in the diagram, they can be distinguished by naming them e.g. TextUi1:TextUi and TextUi2:TextUi.

    Arrows representing method calls should be solid arrows while those representing method returns should be dashed arrows.

    Note that unlike in object diagrams, the class/object name is not underlined in sequence diagrams.

    The arrowhead style depends on the type of method call. Arrows showing synchronous (i.e., the caller method is blocked from doing anything else until the called method returns) should use filled arrowheads (e.g., ). Most method calls (e.g., normal Java method calls) are synchronous. Asynchronous method calls (i.e., the caller method does not have to wait till the called method returns) are shown using lined arrowheads (e.g., ). As the latter is out of scope for this textbook, all sequence diagram arrow heads you encournter in this textbook will be of the first type.

    [Common notation error] Activation bar too long: The activation bar of a method cannot start before the method call arrives and a method cannot remain active after the method has returned. In the two sequence diagrams below, the one on the left commits this error because the activation bar starts before the method Foo#xyz() is called and remains active after the method returns.

    [Common notation error] Broken activation bar: The activation bar should remain unbroken while the method is being executed, from the point the method is called until the method returns. In the two sequence diagrams below, the one on the left commits this error because the activation bar for the method Foo#abc() is broken in the middle.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/basic/index.page-vue-render.js b/book/uml/sequenceDiagrams/basic/index.page-vue-render.js index 0cca051a17..49d2f14077 100644 --- a/book/uml/sequenceDiagrams/basic/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/basic/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_v("Note that unlike in object diagrams, the "),_c('st with(this){return _c('p',[_c('strong',[_v("The arrowhead style depends on the type of method call.")]),_v(" Arrows showing "),_c('em',[_v("synchronous")]),_v(" (i.e., the caller method is blocked from doing anything else until the called method returns) should use "),_c('em',[_v("filled")]),_v(" arrowheads (e.g., "),_c('img',{attrs:{"src":"/website/book/uml/sequenceDiagrams/basic/images\\filled-arrowhead.png","width":"40"}}),_v("). Most method calls (e.g., normal Java method calls) are synchronous. "),_c('em',[_v("Asynchronous")]),_v(" method calls (i.e., the caller method does not have to wait till the called method returns) are shown using "),_c('em',[_v("lined")]),_v(" arrowheads (e.g., "),_c('img',{attrs:{"src":"/website/book/uml/sequenceDiagrams/basic/images\\lined-arrowhead.png","width":"40"}}),_v("). As the latter is out of scope for this textbook, all sequence diagram arrow heads you encournter in this textbook will be of the first type.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/index.html b/book/uml/sequenceDiagrams/index.html index 28360515f5..1dd7743796 100644 --- a/book/uml/sequenceDiagrams/index.html +++ b/book/uml/sequenceDiagrams/index.html @@ -144,7 +144,7 @@ -

    Alternative paths

    Can interpret sequence diagrams with alternative paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.


    Optional paths

    Can interpret sequence diagrams with optional paths

    UML uses opt frames to indicate optional paths.

    Notation:

    Logic#markCellAt(...) calls Timer#start() only if it is the first move of the player.


    Parallel paths

    Can interpret sequence diagrams with parallel paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.


    Reference frames

    Can interpret sequence diagrams with reference frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.


    Minimal notation

    Can interpret sequence diagrams with minimal notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).


    Calls to static methods

    Can show calls to static methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Alternative paths

    Can interpret sequence diagrams with alternative paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.


    Optional paths

    Can interpret sequence diagrams with optional paths

    UML uses opt frames to indicate optional paths.

    Notation:

    Logic#markCellAt(...) calls Timer#start() only if it is the first move of the player.


    Parallel paths

    Can interpret sequence diagrams with parallel paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.


    Reference frames

    Can interpret sequence diagrams with reference frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.


    Minimal notation

    Can interpret sequence diagrams with minimal notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).


    Calls to static methods

    Can show calls to static methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/index.page-vue-render.js b/book/uml/sequenceDiagrams/index.page-vue-render.js index 225c6192eb..44b60c140b 100644 --- a/book/uml/sequenceDiagrams/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/index.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('h1',{attrs:{"id":"sequence-diagrams"}},[_c('span',[_v("Sequence diagrams")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#sequence-diagrams","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/introduction/index.html b/book/uml/sequenceDiagrams/introduction/index.html index c3a92bf935..acceb4d6e9 100644 --- a/book/uml/sequenceDiagrams/introduction/index.html +++ b/book/uml/sequenceDiagrams/introduction/index.html @@ -66,7 +66,7 @@ -

    Here is the sequence diagram to model the interactions for the method call producePrototype() on a Machine object.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Here is the sequence diagram to model the interactions for the method call producePrototype() on a Machine object.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/introduction/index.page-vue-render.js b/book/uml/sequenceDiagrams/introduction/index.page-vue-render.js index 3a60930db4..494ae3fbde 100644 --- a/book/uml/sequenceDiagrams/introduction/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/introduction/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"introduction"}},[_c('span',[_v with(this){return _c('p',[_c('strong',[_v("A UML sequence diagram "),_c('em',[_v("captures the interactions between multiple entities for a given scenario.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/loops/index.html b/book/uml/sequenceDiagrams/loops/index.html index abe4f9c938..3ff2523052 100644 --- a/book/uml/sequenceDiagrams/loops/index.html +++ b/book/uml/sequenceDiagrams/loops/index.html @@ -13,7 +13,7 @@ +

    Loops

    Notation:

    The Player calls the mark x,y command or clear x y command repeatedly until the game is won or lost.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/loops/index.page-vue-render.js b/book/uml/sequenceDiagrams/loops/index.page-vue-render.js index da7d8949d3..8bce59ec68 100644 --- a/book/uml/sequenceDiagrams/loops/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/loops/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',[_c('h4',{attrs:{"id":"loops"}},[_c('span',[_v("Loops")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#loops","onclick":"event.stopPropagation()"}})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/minimalNotation/index.html b/book/uml/sequenceDiagrams/minimalNotation/index.html index a5dbeaebb1..6905c0d472 100644 --- a/book/uml/sequenceDiagrams/minimalNotation/index.html +++ b/book/uml/sequenceDiagrams/minimalNotation/index.html @@ -13,7 +13,7 @@

    Can interpret sequence diagrams with minimal notation

    Tools → UML → Sequence Diagrams → -

    Minimal notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Minimal notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/minimalNotation/index.page-vue-render.js b/book/uml/sequenceDiagrams/minimalNotation/index.page-vue-render.js index dfc0f1ca26..10f070ac28 100644 --- a/book/uml/sequenceDiagrams/minimalNotation/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/minimalNotation/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"minimal-notation"}},[_c('span' with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" If method parameters don't matter to the purpose of the sequence diagram, you can omit them using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" e.g., use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(int size, double weight)")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/objectCreation/index.html b/book/uml/sequenceDiagrams/objectCreation/index.html index 392bf5d4a8..de627f7e53 100644 --- a/book/uml/sequenceDiagrams/objectCreation/index.html +++ b/book/uml/sequenceDiagrams/objectCreation/index.html @@ -13,7 +13,7 @@ +

    Object creation

    Notation:

    • The arrow that represents the constructor arrives at the side of the box representing the instance.
    • The activation bar represents the period the constructor is active.

    The Logic object creates a Minefield object.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/objectCreation/index.page-vue-render.js b/book/uml/sequenceDiagrams/objectCreation/index.page-vue-render.js index 0830fdc320..c9115ae42d 100644 --- a/book/uml/sequenceDiagrams/objectCreation/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/objectCreation/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"object-creation"}},[_c('span', with(this){return _c('ul',[_c('li',[_v("The arrow that represents the constructor arrives at the side of the box representing the instance.")]),_v(" "),_c('li',[_v("The activation bar represents the period the constructor is active.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/objectDeletion/index.html b/book/uml/sequenceDiagrams/objectDeletion/index.html index f73a9904ac..8c90e37cb8 100644 --- a/book/uml/sequenceDiagrams/objectDeletion/index.html +++ b/book/uml/sequenceDiagrams/objectDeletion/index.html @@ -53,7 +53,7 @@ -

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/objectDeletion/index.page-vue-render.js b/book/uml/sequenceDiagrams/objectDeletion/index.page-vue-render.js index 53e4e1d093..17e33a15ce 100644 --- a/book/uml/sequenceDiagrams/objectDeletion/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/objectDeletion/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("UML uses an "),_c('code',{pre:true,at with(this){return _c('p',[_v("Although languages such as Java do not support a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" operation (because they use automatic memory management), "),_c('strong',[_v("you can use the object deletion notation to indicate the point at which the object becomes "),_c('em',[_v("ready to be garbage-collected")])]),_v(" (i.e., the point at which it ceases to be referenced).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/optionalPaths/index.html b/book/uml/sequenceDiagrams/optionalPaths/index.html index cd0751ba55..c8bc0d6641 100644 --- a/book/uml/sequenceDiagrams/optionalPaths/index.html +++ b/book/uml/sequenceDiagrams/optionalPaths/index.html @@ -13,7 +13,7 @@ +

    Optional paths

    UML uses opt frames to indicate optional paths.

    Notation:

    Logic#markCellAt(...) calls Timer#start() only if it is the first move of the player.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/optionalPaths/index.page-vue-render.js b/book/uml/sequenceDiagrams/optionalPaths/index.page-vue-render.js index d1270f548c..1a085fd970 100644 --- a/book/uml/sequenceDiagrams/optionalPaths/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/optionalPaths/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"optional-paths"}},[_c('span',[ with(this){return _c('p',[_c('strong',[_v("UML uses "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("opt")]),_v(" frames to indicate optional paths.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/parallelPaths/index.html b/book/uml/sequenceDiagrams/parallelPaths/index.html index ee8605bb79..1d2c382de3 100644 --- a/book/uml/sequenceDiagrams/parallelPaths/index.html +++ b/book/uml/sequenceDiagrams/parallelPaths/index.html @@ -13,7 +13,7 @@

    Can interpret sequence diagrams with parallel paths

    Tools → UML → Sequence Diagrams → -

    Parallel paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Parallel paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/parallelPaths/index.page-vue-render.js b/book/uml/sequenceDiagrams/parallelPaths/index.page-vue-render.js index 9acec5a684..9eff35df74 100644 --- a/book/uml/sequenceDiagrams/parallelPaths/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/parallelPaths/index.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("UML uses "),_c('code',{pre:true,attrs with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be "),_c('em',[_v("multi-threaded")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("because a normal Java program cannot do multiple things at the same time")]),_v(".")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/referenceFrames/index.html b/book/uml/sequenceDiagrams/referenceFrames/index.html index 6b1c313d74..9de9b0a847 100644 --- a/book/uml/sequenceDiagrams/referenceFrames/index.html +++ b/book/uml/sequenceDiagrams/referenceFrames/index.html @@ -13,7 +13,7 @@

    Can interpret sequence diagrams with reference frames

    Tools → UML → Sequence Diagrams → -

    Reference frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Reference frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/referenceFrames/index.page-vue-render.js b/book/uml/sequenceDiagrams/referenceFrames/index.page-vue-render.js index 598b651ffe..0aee529f36 100644 --- a/book/uml/sequenceDiagrams/referenceFrames/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/referenceFrames/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"reference-frames"}},[_c('span' with(this){return _c('p',[_c('strong',[_v("UML uses "),_c('em',[_v("ref frame")]),_v(" to allow a segment of the interaction to be omitted and shown as a separate sequence diagram.")]),_v(" Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/selfInvocation/index.html b/book/uml/sequenceDiagrams/selfInvocation/index.html index df867c0217..fdbb715760 100644 --- a/book/uml/sequenceDiagrams/selfInvocation/index.html +++ b/book/uml/sequenceDiagrams/selfInvocation/index.html @@ -51,7 +51,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/selfInvocation/index.page-vue-render.js b/book/uml/sequenceDiagrams/selfInvocation/index.page-vue-render.js index e74bb96bfd..8655175ba8 100644 --- a/book/uml/sequenceDiagrams/selfInvocation/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/selfInvocation/index.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success with(this){return _c('code',{pre:true,attrs:{"class":"no-line-numbers hljs java"}},[_c('span',[_v("Book b = "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("new")]),_v(" Book();\n")]),_c('span',[_v("Chapter c = "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("new")]),_v(" Chapter();\n")]),_c('span',[_v("b.add(c);\n")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/book/uml/sequenceDiagrams/staticMethods/index.html b/book/uml/sequenceDiagrams/staticMethods/index.html index 85b7b49fa3..bfa7e2ee88 100644 --- a/book/uml/sequenceDiagrams/staticMethods/index.html +++ b/book/uml/sequenceDiagrams/staticMethods/index.html @@ -13,7 +13,7 @@

    Can show calls to static methods

    Tools → UML → Sequence Diagrams → -

    Calls to static methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Calls to static methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/book/uml/sequenceDiagrams/staticMethods/index.page-vue-render.js b/book/uml/sequenceDiagrams/staticMethods/index.page-vue-render.js index 1560caa454..3e13256543 100644 --- a/book/uml/sequenceDiagrams/staticMethods/index.page-vue-render.js +++ b/book/uml/sequenceDiagrams/staticMethods/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('h4',{attrs:{"id":"calls-to-static-methods"}},[_c with(this){return _c('p',[_v("Method calls to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("static")]),_v(" (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" to show that a participant is the class itself.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/git-trail/index.html b/git-trail/index.html index 0382f3ac77..02d1244ab3 100644 --- a/git-trail/index.html +++ b/git-trail/index.html @@ -1868,7 +1868,7 @@ -

    If you pull but your local branch has new commits the remote branch doesn't have, Git will automatically perform a merge between the local branch and the remote branch.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    If you pull but your local branch has new commits the remote branch doesn't have, Git will automatically perform a merge between the local branch and the remote branch.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/git-trail/index.page-vue-render.js b/git-trail/index.page-vue-render.js index 81f96087c5..bac183d785 100644 --- a/git-trail/index.page-vue-render.js +++ b/git-trail/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('h1',{attrs:{"id":"phase-3-working-with-remote-repos"}},[_c with(this){return _c('h1',{attrs:{"id":"phase-4-working-with-branches"}},[_c('div',{staticClass:"text-white bg-success p-1"},[_c('span',{staticClass:"text-light"},[_c('span',{staticClass:"fas fa-map-marker-alt",attrs:{"aria-hidden":"true"}})]),_v(" Phase 4: Working With Branches")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#phase-4-working-with-branches","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/index.html b/index.html index fa25c52cd6..1eb9698bf7 100644 --- a/index.html +++ b/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 12 [Mon, Nov 4th] - Summary

    Next week's briefing (and the PE Dry Run)

    Heads up! Attendance is compulsory for the weekly briefing coming up on Fri, Nov 8th , as we use that time slot for the Practical Exam Dry Run (graded).

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 12 [Mon, Nov 4th] - Summary

    Next week's briefing (and the PE Dry Run)

    Heads up! Attendance is compulsory for the weekly briefing coming up on Fri, Nov 8th , as we use that time slot for the Practical Exam Dry Run (graded).

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/index.page-vue-render.js b/index.page-vue-render.js index 07c00697f0..818eff0f67 100644 --- a/index.page-vue-render.js +++ b/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",att with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Nov 8th 1600-1800")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/index.html b/schedule/index.html index 10a2590fe5..0218d198d8 100644 --- a/schedule/index.html +++ b/schedule/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 12 [Mon, Nov 4th] - Summary

    Next week's briefing (and the PE Dry Run)

    Heads up! Attendance is compulsory for the weekly briefing coming up on Fri, Nov 8th , as we use that time slot for the Practical Exam Dry Run (graded).

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 12 [Mon, Nov 4th] - Summary

    Next week's briefing (and the PE Dry Run)

    Heads up! Attendance is compulsory for the weekly briefing coming up on Fri, Nov 8th , as we use that time slot for the Practical Exam Dry Run (graded).

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/index.page-vue-render.js b/schedule/index.page-vue-render.js index 7dcbf016e4..a9789da381 100644 --- a/schedule/index.page-vue-render.js +++ b/schedule/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",att with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Nov 8th 1600-1800")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/timeline.html b/schedule/timeline.html index 456e025eab..df83f1852a 100644 --- a/schedule/timeline.html +++ b/schedule/timeline.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Summary of the Course Timeline


    Topics:

    • [W1.1] OOP: Classes & Objects

    • [W1.2] OOP Inheritance

    • [W1.3] OOP: Polymorphism

    • [W1.4] Java: Collections

    • [W1.5] Exception Handling

    Full ToC


    Admin:

    1. Submit the pre-course survey Fri, Aug 16th 2359
    2. Learn about the course
    3. Submit prereq topics quiz Mon, Aug 19th 2359
    4. Set up the tools by Friday
    5. [Optional] Follow the Git learning trail

    Topics:

    • [W2.2] SDLC Process Models: Basics

    • [W2.3] RCS: Revision History

    • [W2.4] RCS: Remote Repos

    • [W2.5] IDEs: Basic Features

    • [W2.6] Automated Testing of Text UIs

    Full ToC


    Admin:

    1. Submit weekly quiz Fri, Aug 23rd 1600
    2. Get connected to our communication channels

    iP:

    1. Learn about the project
    2. Set up prerequisites
    3. Set up the project in your computer
    4. Add Increments while committing frequently: Level-0, Level-1, Level-2, Level-3, Level-4, A-TextUiTesting, Level-5, Level-6, A-Enums Fri, Aug 23rd 1600

    Topics:

    • [W3.1] RCS: Branching

    • [W3.2] RCS: Creating Pull Requests

    • [W3.3] Automating the Build Process

    • [W3.4] Java: JavaDoc, file I/O, packages, JARs

    • [W3.5] Code Quality: Coding Standards

    • [W3.6] Developer Testing

    • [W3.7] Unit Testing

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [CS2103 students only] Form teams during the tutorial

    iP:

    1. Do any leftover iP tasks from the previous week
    2. Create a PR to the upstream repo
    3. Add Increments as branches: Level-7, Level-8
    4. Add Increments: A-MoreOOP, A-Packages, A-Gradle, A-JUnit, A-Jar
    5. Add Increments as parallel branches: A-JavaDoc, A-CodingStandard, Level-9
    6. [Optional] Get a head start on JavaFX

    tP:

    1. Individual Task: Explore AB3 features Sat, Aug 31st 23:59
    2. Team Task: Set up a project meeting time by the end of the tutorial
    3. Team Task: Check up on team's collective iP status Tue, Sep 3rd

    Topics:

    • [W4.1] Design: Models

    • [W4.2] Class/Object Diagrams: Basics

    • [W4.3] Class Diagrams: Intermediate-Level

    • [W4.4] Java: JavaFX

    • [W4.5] Java: varargs

    • [W4.6] Code Quality: Naming

    • [W4.7] Static Analysis

    • [W4.8] Code reviews

    • [W4.9] RCS: Managing Pull Requests I

    Full ToC


    Admin:

    1. Accept GitHub invitation from the course organization
    2. Submit weekly quiz

    iP:

    1. Use GFMD in the PR description
    2. Review some peer PRs Fri, Sep 6th 1600
    3. Learn from others (optional)
    4. Add Increments as branches: A-CheckStyle, Level-10, A-Varargs

    tP:

    1. Start weekly project meetings
    2. Start a collaborative doc to take project notes before the tutorial
    3. Decide on an overall project direction (user profile, value proposition) decide by tutorial, submit by Sat

    Topics:

    • [W5.1] Requirements: Intro

    • [W5.2] Requirements: Gathering

    • [W5.3] Requirements: Specifying

    • [W5.8] RCS: Managing Pull Requests II

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [optional] Submit midterm feedback for the course Sat, Sep 14th 2359
    3. Prelim peer evaluation on TEAMMATES Thu, Sep 12th 2359

    iP:

    1. Generate a new JAR file
    2. Write some full commit messages
    3. Add Increments as PRs: A-Assertions, A-CodeQuality, A-Streams
    4. Add Increment: A-CI
    5. Add an extension

    tP:

    1. Brainstorm user stories before the tutorial
    2. Choose user stories for the MVP version before/during the tutorial

    Topics:

    • [W6.1] Modeling: Sequence Diagrams

    • [W6.2] Architecture Diagrams

    • [W6.3] IDEs: Intermediate Features

    • [W6.4] Logging

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. Add Increments: A-BetterGui, A-Personality, A-MoreErrorHandling, A-MoreTesting, A-AiAssisted
    2. Finalize the features
    3. Set up a product website
    4. Submit the final version Fri, Sep 20th 2359

    tP:

    1. Conceptualize the MVP version
    2. Draft the feature specification Sun, Sep 22nd 23:59
    3. Set up the project repo
    4. Get familiar with the codebase

    Topics:

    • [W7.1] Requirements: Use Cases

    • [W7.2] Design: High-Level View

    • [W7.3] Design: Fundamentals

    • [W7.4] IDEs: Advanced Features : OPTIONAL

    • [W7.5] Integration Approaches

    • [W7.6] Project Mgt: Scheduling and Tracking

    • [W7.7] Project Mgt: Workflows

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. [Optional] Get more out of the iP

    tP: v1.1

    1. Do a 'workflow practice' session Thu, Oct 3rd 23:59
    2. Update the project website
    3. Update the DG: user stories, glossary, NFRs, use cases
    4. Start the next iteration

    Topics:

    • [W8.1] [Revisiting] Drawing Class/Object Diagrams - Basics

    • [W8.2] [Revisiting] Drawing Class/Object Diagrams - Intermediate

    • [W8.3] [Revisiting] Drawing Sequence Diagrams

    • [W8.4] Testing: Types

    • [W8.5] Testing: Intermediate Concepts

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Submit midterm peer evaluations on TEAMMATES Sun, Oct 13th 2359

    iP:

    1. Evaluate two peer iPs Sat, Oct 12th 2359

    tP: v1.2

    1. Divide MVP features among members
    2. / [Optional] Rename packages/classes
    3. Add the first functionality increment Thu, Oct 10th 23:59

    Topics:

    • [W9.1] Conceptual Class Diagrams (aka OODMs)

    • [W9.2] Activity Diagrams

    • [W9.3] Conceptualizing a Design

    • [W9.4] Architecture Diagrams: Drawing

    • [W9.5] Design Principles

    • [W9.6] [Revisiting] SDLC Process Models

    • [W9.7] SDLC Process Models (continued)

    • [W9.8] Writing Developer Documents

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.3

    1. Plan the first product release (v1.3)
    2. Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    Topics:

    • [W10.2] Defensive Programming

    • [W10.3] Test Cases: Intro

    • [W10.4] Test Cases: Equivalence Partitioning

    • [W10.5] Test Cases: Boundary Value Analysis

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Take part in the CATcher load testing during the briefing on Oct 25th

    tP: v1.4

    1. Do a postmortem of the previous iteration before the tutorial
    2. Plan the alpha version (v1.4)
    3. Deliver the alpha version (v1.4) Thu, Oct 24th 23:59
    4. Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00
    5. Start updating UML diagrams in the DG

    Topics:

    • [W11.1] More Design Patterns

    • [W11.2] Architectural Styles

    • [W11.3] Test Cases: Combining Multiple Inputs

    • [W11.4] Other QA Techniques

    • [W11.7] Other UML Models : OPTIONAL

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.5

    1. Alpha-test the product
    2. Fix alpha-test bugs, fine-tune features
    3. Update UG and DG
    4. Release v1.5 Thu, Nov 7th 23:59

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit final peer evaluation on TEAMMATES Thu, Nov 14th 2359
    2. Submit the PE-Readiness Quiz before the PE

    tP: v1.6

    1. Fix PE-D bugs
    2. Submit final deliverables Tue, Nov 12th 14:00
    3. Prepare for the practical exam
    4. Ensure the code is RepoSense-compatible
    5. Attend the practical exam Fri, Nov 15th 1600-1800
    6. [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Summary of the Course Timeline


    Topics:

    • [W1.1] OOP: Classes & Objects

    • [W1.2] OOP Inheritance

    • [W1.3] OOP: Polymorphism

    • [W1.4] Java: Collections

    • [W1.5] Exception Handling

    Full ToC


    Admin:

    1. Submit the pre-course survey Fri, Aug 16th 2359
    2. Learn about the course
    3. Submit prereq topics quiz Mon, Aug 19th 2359
    4. Set up the tools by Friday
    5. [Optional] Follow the Git learning trail

    Topics:

    • [W2.2] SDLC Process Models: Basics

    • [W2.3] RCS: Revision History

    • [W2.4] RCS: Remote Repos

    • [W2.5] IDEs: Basic Features

    • [W2.6] Automated Testing of Text UIs

    Full ToC


    Admin:

    1. Submit weekly quiz Fri, Aug 23rd 1600
    2. Get connected to our communication channels

    iP:

    1. Learn about the project
    2. Set up prerequisites
    3. Set up the project in your computer
    4. Add Increments while committing frequently: Level-0, Level-1, Level-2, Level-3, Level-4, A-TextUiTesting, Level-5, Level-6, A-Enums Fri, Aug 23rd 1600

    Topics:

    • [W3.1] RCS: Branching

    • [W3.2] RCS: Creating Pull Requests

    • [W3.3] Automating the Build Process

    • [W3.4] Java: JavaDoc, file I/O, packages, JARs

    • [W3.5] Code Quality: Coding Standards

    • [W3.6] Developer Testing

    • [W3.7] Unit Testing

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [CS2103 students only] Form teams during the tutorial

    iP:

    1. Do any leftover iP tasks from the previous week
    2. Create a PR to the upstream repo
    3. Add Increments as branches: Level-7, Level-8
    4. Add Increments: A-MoreOOP, A-Packages, A-Gradle, A-JUnit, A-Jar
    5. Add Increments as parallel branches: A-JavaDoc, A-CodingStandard, Level-9
    6. [Optional] Get a head start on JavaFX

    tP:

    1. Individual Task: Explore AB3 features Sat, Aug 31st 23:59
    2. Team Task: Set up a project meeting time by the end of the tutorial
    3. Team Task: Check up on team's collective iP status Tue, Sep 3rd

    Topics:

    • [W4.1] Design: Models

    • [W4.2] Class/Object Diagrams: Basics

    • [W4.3] Class Diagrams: Intermediate-Level

    • [W4.4] Java: JavaFX

    • [W4.5] Java: varargs

    • [W4.6] Code Quality: Naming

    • [W4.7] Static Analysis

    • [W4.8] Code reviews

    • [W4.9] RCS: Managing Pull Requests I

    Full ToC


    Admin:

    1. Accept GitHub invitation from the course organization
    2. Submit weekly quiz

    iP:

    1. Use GFMD in the PR description
    2. Review some peer PRs Fri, Sep 6th 1600
    3. Learn from others (optional)
    4. Add Increments as branches: A-CheckStyle, Level-10, A-Varargs

    tP:

    1. Start weekly project meetings
    2. Start a collaborative doc to take project notes before the tutorial
    3. Decide on an overall project direction (user profile, value proposition) decide by tutorial, submit by Sat

    Topics:

    • [W5.1] Requirements: Intro

    • [W5.2] Requirements: Gathering

    • [W5.3] Requirements: Specifying

    • [W5.8] RCS: Managing Pull Requests II

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [optional] Submit midterm feedback for the course Sat, Sep 14th 2359
    3. Prelim peer evaluation on TEAMMATES Thu, Sep 12th 2359

    iP:

    1. Generate a new JAR file
    2. Write some full commit messages
    3. Add Increments as PRs: A-Assertions, A-CodeQuality, A-Streams
    4. Add Increment: A-CI
    5. Add an extension

    tP:

    1. Brainstorm user stories before the tutorial
    2. Choose user stories for the MVP version before/during the tutorial

    Topics:

    • [W6.1] Modeling: Sequence Diagrams

    • [W6.2] Architecture Diagrams

    • [W6.3] IDEs: Intermediate Features

    • [W6.4] Logging

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. Add Increments: A-BetterGui, A-Personality, A-MoreErrorHandling, A-MoreTesting, A-AiAssisted
    2. Finalize the features
    3. Set up a product website
    4. Submit the final version Fri, Sep 20th 2359

    tP:

    1. Conceptualize the MVP version
    2. Draft the feature specification Sun, Sep 22nd 23:59
    3. Set up the project repo
    4. Get familiar with the codebase

    Topics:

    • [W7.1] Requirements: Use Cases

    • [W7.2] Design: High-Level View

    • [W7.3] Design: Fundamentals

    • [W7.4] IDEs: Advanced Features : OPTIONAL

    • [W7.5] Integration Approaches

    • [W7.6] Project Mgt: Scheduling and Tracking

    • [W7.7] Project Mgt: Workflows

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. [Optional] Get more out of the iP

    tP: v1.1

    1. Do a 'workflow practice' session Thu, Oct 3rd 23:59
    2. Update the project website
    3. Update the DG: user stories, glossary, NFRs, use cases
    4. Start the next iteration

    Topics:

    • [W8.1] [Revisiting] Drawing Class/Object Diagrams - Basics

    • [W8.2] [Revisiting] Drawing Class/Object Diagrams - Intermediate

    • [W8.3] [Revisiting] Drawing Sequence Diagrams

    • [W8.4] Testing: Types

    • [W8.5] Testing: Intermediate Concepts

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Submit midterm peer evaluations on TEAMMATES Sun, Oct 13th 2359

    iP:

    1. Evaluate two peer iPs Sat, Oct 12th 2359

    tP: v1.2

    1. Divide MVP features among members
    2. / [Optional] Rename packages/classes
    3. Add the first functionality increment Thu, Oct 10th 23:59

    Topics:

    • [W9.1] Conceptual Class Diagrams (aka OODMs)

    • [W9.2] Activity Diagrams

    • [W9.3] Conceptualizing a Design

    • [W9.4] Architecture Diagrams: Drawing

    • [W9.5] Design Principles

    • [W9.6] [Revisiting] SDLC Process Models

    • [W9.7] SDLC Process Models (continued)

    • [W9.8] Writing Developer Documents

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.3

    1. Plan the first product release (v1.3)
    2. Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    Topics:

    • [W10.2] Defensive Programming

    • [W10.3] Test Cases: Intro

    • [W10.4] Test Cases: Equivalence Partitioning

    • [W10.5] Test Cases: Boundary Value Analysis

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Take part in the CATcher load testing during the briefing on Oct 25th

    tP: v1.4

    1. Do a postmortem of the previous iteration before the tutorial
    2. Plan the alpha version (v1.4)
    3. Deliver the alpha version (v1.4) Thu, Oct 24th 23:59
    4. Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00
    5. Start updating UML diagrams in the DG

    Topics:

    • [W11.1] More Design Patterns

    • [W11.2] Architectural Styles

    • [W11.3] Test Cases: Combining Multiple Inputs

    • [W11.4] Other QA Techniques

    • [W11.7] Other UML Models : OPTIONAL

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.5

    1. Alpha-test the product
    2. Fix alpha-test bugs, fine-tune features
    3. Update UG and DG
    4. Release v1.5 Thu, Nov 7th 23:59

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit final peer evaluation on TEAMMATES Thu, Nov 14th 2359
    2. Submit the PE-Readiness Quiz before the PE

    tP: v1.6

    1. Fix PE-D bugs
    2. Submit final deliverables Tue, Nov 12th 14:00
    3. Prepare for the practical exam
    4. Ensure the code is RepoSense-compatible
    5. Attend the practical exam Fri, Nov 15th 1600-1800
    6. [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/timeline.page-vue-render.js b/schedule/timeline.page-vue-render.js index c41891eae1..4fc5f091d2 100644 --- a/schedule/timeline.page-vue-render.js +++ b/schedule/timeline.page-vue-render.js @@ -377,6 +377,6 @@ with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"}, with(this){return _c('div',[_c('p',[_c('strong',[_v("tP:")]),_v(" "),_c('span',{staticClass:"border rounded text-success border-success pe-1 ps-1"},[_c('span',{staticClass:"fas fa-tag",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("v1.6")])])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Fix PE-D bugs")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Submit final deliverables")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Tue, Nov 12th 14:00")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Prepare for the practical exam")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Ensure the code is RepoSense-compatible")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Attend the practical exam")]),_v(" "),_c('span',{staticClass:"badge bg-warning text-dark font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Nov 15th 1600-1800")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("[if needed] Attend the makeup practical exam")])]),_v(" "),_c('span',{staticClass:"badge bg-secondary font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Sun, Nov 17th 1400-1600")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week1/admin.html b/schedule/week1/admin.html index c2e9927309..d311fb8c08 100644 --- a/schedule/week1/admin.html +++ b/schedule/week1/admin.html @@ -13,7 +13,7 @@

    Week 1 [Mon, Aug 12th] - Admin

    This is the Admin tab of this week. It contains admin info relevant to this week.

    A label with the icon indicates the deadline for that task (e.g., Friday 2359).

    1. Submit the pre-course survey Fri, Aug 16th 2359
    2. Learn about the course
    3. Submit prereq topics quiz Mon, Aug 19th 2359
    4. Set up the tools by Friday
    5. [Optional] Follow the Git learning trail

    1 Submit the pre-course survey Fri, Aug 16th 2359

    • Submit the pre-course survey (compulsory because it collects some important information about you e.g., your GitHub username.) -- will be open on Canvas, latest by Week 1 Monday.

    2 Learn about the course

    You can use the button in a panel to open it as a new tab (it can be expanded in-place too). This feature is available only for panels containing another full page of the website (i.e., not available if the panel contains an extract of a page).
    • Read the following admin info about the course.

    Admin Course expectations and topic levels


    Admin Weekly schedule


    Admin Course overview


    3 Submit prereq topics quiz Mon, Aug 19th 2359

    • Read prerequisite Topics allocated for week 1. Submit Week 1 Quiz (aka prereq topics quiz) (on Canvas) to demonstrate your knowledge of those topics.
      This quiz counts for participation (as indicated by the icon above).

    FAQ When can we see the quiz answers?


    Admin Participation


    4 Set up the tools by Friday

    • Follow the tool Preparation instructions given in the following panels.

    Admin Programming Language


    5 [Optional] Follow the Git learning trail

    • If you have time to spare while waiting for the semester to start, and would like to get a headstart on learning Git and GitHub (used a lot in this course), you are welcome to follow the Git Learning Trail.
      -Doing so is totally optional, as the same content will be covered during the subsequent weeks as well.

    + Other info relevant to this week:

    FAQ Where is everything?


    Admin tP: Forming Teams

    Admin Textbooks

    Admin Grade Breakdown

    FAQ What are the differences between CS2103T and CS2103?


    FAQ What are the extra requirements to get an A+?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Doing so is totally optional, as the same content will be covered during the subsequent weeks as well.

    + Other info relevant to this week:

    FAQ Where is everything?


    Admin tP: Forming Teams

    Admin Textbooks

    Admin Grade Breakdown

    FAQ What are the differences between CS2103T and CS2103?


    FAQ What are the extra requirements to get an A+?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week1/admin.page-vue-render.js b/schedule/week1/admin.page-vue-render.js index 605fd52b6f..772457860f 100644 --- a/schedule/week1/admin.page-vue-render.js +++ b/schedule/week1/admin.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('ul',[_c('li',[_v("Follow the tool "),_c('span',{staticClas with(this){return _c('div',[_c('ul',[_c('li',[_v("If you have time to spare while waiting for the semester to start, and would like to get a headstart on learning Git and GitHub (used a lot in this course), you are welcome to follow the "),_c('a',{attrs:{"href":"/website/git-trail/index.html"}},[_v("Git Learning Trail")]),_v("."),_c('br'),_v("\nDoing so is totally optional, as the same content will be covered during the subsequent weeks as well.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week1/index.html b/schedule/week1/index.html index 137acf2aed..2872fba4d8 100644 --- a/schedule/week1/index.html +++ b/schedule/week1/index.html @@ -14,7 +14,7 @@

    Week 1 [Mon, Aug 12th] - Summary

    OK, I'm here. What am I looking at? What should I do next? ...

    This is the Summary tab of the weekly schedule page of this week. It contains a summary of the week, and announcements relevant to that week.

    In each week, you are expected to go through all the tabs for that week (i.e., Topics, Admin Info, ...) given at the top of the weekly schedule page and follow the instructions in them. FYI, a full timeline is available too.

    Before you move to other tabs, take note of any important information in this summary tab, such as announcements relevant to this week and briefing videos to watch.

    Now, some announcements relevant to this week ...

    • There is no lecture in week 1. In lieu of that, we are giving you a series of pre-recorded briefing videos (given in the panel below), so that you can get started early.
      Our first lecture will be on week 2 (Fri, Aug 23rd 1600-1800), delivered in hybrid mode.
    • Our tutorials start on week 3.
    • If you are bookmarking the course website in your browser, bookmark the URL https://nus-cs2103-ay2425s1.github.io/website (i.e., the base URL, without pointing to any specific page).
      Reason: This base URL will take you to the schedule page of the current week automatically.
    • [CS2103T Students]: Of the many weekly sessions that appear under CS2103T, only two actually belong to CS2103T. Those are, the lecture slot on Friday 1600-1800, and the 1-hour tutorial slot. The other 3-hour slots belong to the CS2101 course.
      All CS2101 sessions start in week 1.

    [MUST-WATCH] Briefing Videos for Week 1

    Before you do anything else please watch the following briefing videos in the order given. NUSNET login is required to access videos.

    Watching course briefing videos counts for participation.
    -When watching a briefing video for the first time, avoid or jumping ahead/around in the video timeline, as this can interfere with the video platform's capturing of what part of the video you actually watched. However, watching at faster speeds is fine.

    We have added closed captioning support for course briefing videos.

    1. Welcome to the Course:

    Video 1 min

    2. Course Goals: How the goals of this course shape its structure (possibly different from other courses), and how it should be approached by students.

    Video 9 mins

    3. Week 1 Briefing: As this is the first weekly briefing, it also covers some general points relevant to all future weeks.

    Video 4 mins


    Topics:

    • [W1.1] OOP: Classes & Objects

    • [W1.2] OOP Inheritance

    • [W1.3] OOP: Polymorphism

    • [W1.4] Java: Collections

    • [W1.5] Exception Handling

    Full ToC


    Admin:

    1. Submit the pre-course survey Fri, Aug 16th 2359
    2. Learn about the course
    3. Submit prereq topics quiz Mon, Aug 19th 2359
    4. Set up the tools by Friday
    5. [Optional] Follow the Git learning trail

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +When watching a briefing video for the first time, avoid or jumping ahead/around in the video timeline, as this can interfere with the video platform's capturing of what part of the video you actually watched. However, watching at faster speeds is fine.

    We have added closed captioning support for course briefing videos.

    1. Welcome to the Course:

    Video 1 min

    2. Course Goals: How the goals of this course shape its structure (possibly different from other courses), and how it should be approached by students.

    Video 9 mins

    3. Week 1 Briefing: As this is the first weekly briefing, it also covers some general points relevant to all future weeks.

    Video 4 mins


    Topics:

    • [W1.1] OOP: Classes & Objects

    • [W1.2] OOP Inheritance

    • [W1.3] OOP: Polymorphism

    • [W1.4] Java: Collections

    • [W1.5] Exception Handling

    Full ToC


    Admin:

    1. Submit the pre-course survey Fri, Aug 16th 2359
    2. Learn about the course
    3. Submit prereq topics quiz Mon, Aug 19th 2359
    4. Set up the tools by Friday
    5. [Optional] Follow the Git learning trail

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week1/index.page-vue-render.js b/schedule/week1/index.page-vue-render.js index 0eb78a0a7c..6284bbed22 100644 --- a/schedule/week1/index.page-vue-render.js +++ b/schedule/week1/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('li',[_c('span',[_v("Set up the tools")]),_v(" "),_c('span' with(this){return _c('li',[_c('span',[_v("[Optional] Follow the Git learning trail")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week1/project.html b/schedule/week1/project.html index 14cf370484..cad6fd0b3b 100644 --- a/schedule/week1/project.html +++ b/schedule/week1/project.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week1/project.page-vue-render.js b/schedule/week1/project.page-vue-render.js index cb27825d1e..5b9bd12efe 100644 --- a/schedule/week1/project.page-vue-render.js +++ b/schedule/week1/project.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"week-1-mon-aug-12th-project"}},[_v("Week with(this){return _c('p',[_c('strong',[_v("There are no project activities allocated for this week.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week1/topics.html b/schedule/week1/topics.html index 5436000e6b..1c62e56580 100644 --- a/schedule/week1/topics.html +++ b/schedule/week1/topics.html @@ -3848,7 +3848,7 @@ -

    Partial solution




    W1.5f :

    Implementation → Error Handling → Exceptions → When

    Can avoid using exceptions to control normal workflow

    In general, use exceptions only for 'unusual' conditions. Use normal return statements to pass control to the caller for conditions that are 'normal'.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Partial solution




    W1.5f :

    Implementation → Error Handling → Exceptions → When

    Can avoid using exceptions to control normal workflow

    In general, use exceptions only for 'unusual' conditions. Use normal return statements to pass control to the caller for conditions that are 'normal'.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week1/topics.page-vue-render.js b/schedule/week1/topics.page-vue-render.js index 85d4b53732..129bf611b8 100644 --- a/schedule/week1/topics.page-vue-render.js +++ b/schedule/week1/topics.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('div',{staticClass:"indented"},[_c('div')])} with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week1/tutorial.html b/schedule/week1/tutorial.html index 29078e04b6..b313482d5c 100644 --- a/schedule/week1/tutorial.html +++ b/schedule/week1/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week1/tutorial.page-vue-render.js b/schedule/week1/tutorial.page-vue-render.js index 475179f8f9..18202664f9 100644 --- a/schedule/week1/tutorial.page-vue-render.js +++ b/schedule/week1/tutorial.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"week-1-mon-aug-12th-tutorial"}},[_v("Wee with(this){return _c('div',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("tutorial N")]),_v(" to mean "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("the tutorial in week N")]),_v("."),_c('br')]),_v(" "),_c('p',[_c('strong',[_v("There is no tutorial in week 1.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week10/admin.html b/schedule/week10/admin.html index c173327280..1e4fa5cf0f 100644 --- a/schedule/week10/admin.html +++ b/schedule/week10/admin.html @@ -14,7 +14,7 @@

    Week 10 [Mon, Oct 21st] - Admin

    1. Submit weekly quiz
    2. Take part in the CATcher load testing during the briefing on Oct 25th

    1 Submit weekly quiz

    • Weekly quiz: Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline (i.e., before the following weekly briefing).

    2 Take part in the CATcher load testing during the briefing on Oct 25th

    • Attend the live weekly briefing and take part in the CATcher load/stress testing session that will take place during the first 15 minutes of the -briefing. More instructions will be provided during the briefing.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +briefing. More instructions will be provided during the briefing.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week10/admin.page-vue-render.js b/schedule/week10/admin.page-vue-render.js index afd02a327d..b9c3552f6f 100644 --- a/schedule/week10/admin.page-vue-render.js +++ b/schedule/week10/admin.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('div',[_c('ul',[_c('li',[_v("Attend the live weekly briefing and take part in the CATcher load/stress testing session that will take place during the first 15 minutes of the\nbriefing. More instructions will be provided during the briefing.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week10/index.html b/schedule/week10/index.html index 235c2aa5cc..bae0b8a953 100644 --- a/schedule/week10/index.html +++ b/schedule/week10/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 10 [Mon, Oct 21st] - Summary

    Topics:

    • [W10.2] Defensive Programming

    • [W10.3] Test Cases: Intro

    • [W10.4] Test Cases: Equivalence Partitioning

    • [W10.5] Test Cases: Boundary Value Analysis

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Take part in the CATcher load testing during the briefing on Oct 25th

    tP: v1.4

    1. Do a postmortem of the previous iteration before the tutorial
    2. Plan the alpha version (v1.4)
    3. Deliver the alpha version (v1.4) Thu, Oct 24th 23:59
    4. Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00
    5. Start updating UML diagrams in the DG

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 10 [Mon, Oct 21st] - Summary

    Topics:

    • [W10.2] Defensive Programming

    • [W10.3] Test Cases: Intro

    • [W10.4] Test Cases: Equivalence Partitioning

    • [W10.5] Test Cases: Boundary Value Analysis

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Take part in the CATcher load testing during the briefing on Oct 25th

    tP: v1.4

    1. Do a postmortem of the previous iteration before the tutorial
    2. Plan the alpha version (v1.4)
    3. Deliver the alpha version (v1.4) Thu, Oct 24th 23:59
    4. Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00
    5. Start updating UML diagrams in the DG

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week10/index.page-vue-render.js b/schedule/week10/index.page-vue-render.js index 191a7efc7b..a00f581070 100644 --- a/schedule/week10/index.page-vue-render.js +++ b/schedule/week10/index.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"}, with(this){return _c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Start updating UML diagrams in the DG")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week10/project.html b/schedule/week10/project.html index 6fab19bb2a..bb09fb693e 100644 --- a/schedule/week10/project.html +++ b/schedule/week10/project.html @@ -20,7 +20,7 @@ Remember to enable assertions in your IDEA run configurations and in the gradle file.

    FAQ Is it enough to update existing UML content/diagrams or must we add new content/diagrams?


    FAQ What if the features I added don't affect UML diagrams?


    Some other relevant FAQs, repeated from last week:

    FAQ Should we try to automate GUI testing as well?


    FAQ All tests pass locally, but the same code fails CI in the PR. How come?


    FAQ PR passed CI before merging, but fails CI after merging. How come?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    4 Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00

    • This activity is compulsory and counts for 3 participation points. Please do it before the weekly deadline.

    Some background: As you know, our includes peer-testing tP products under exam conditions. In the past, we used GitHub as the platform for that -- which was not optimal (e.g., it was hard to ensure the compulsory labels have been applied). As a remedy, some ex-students have been developing an app called that we'll be using for the PE this semester. We still use GitHub to record bugs reported in the PE but CATcher acts as a layer between you and GitHub, to ensure the bugs you report meet PE requirements.

    This week, we would like you to smoke-test the CATcher app to ensure it can work with your OS, Browser, GitHub account, by following the steps given in the panel below.

    • [Heads up] Load-testing CATcher will be done during the upcoming weekly briefing (Fri, Oct 25th ), during the first 15 minutes of briefing. This is different from smoke-testing you did above, and this will count for participation separately.
      Therefore, remember to attend the briefing (via Zoom or F2F) at least for the first 15 minutes (this activity cannot be done any other time).

    5 Start updating UML diagrams in the DG

    This is a good time to get familiar with the diagramming tools used by the tP.

    • Each member is recommended to update at least one UML diagram in the DG, to match the changes you've done so far in v1.4. You may do this towards the end of v1.4, or soon after you finish it.
    • Deadline: This is not part of v1.4. So, you can do this even after you are done with the v1.4 release that is due Thursday 23:59.
      -As this is a regular weekly task, the usual deadline applies i.e., Friday 1600, and as usual, if you miss the deadline, catching up within a few days will still turn it green.
    • Updating the DG text to match the diagrams is optional (it can be done later).
    • FYI, the panel below has some DG tips, some of which are related to drawing diagrams.

    FAQ Why not wait till the end to add/update the DG diagrams?


    End of tP Week 10

    Have any suggestions to improve AB3?

    Now that you have worked with AB3 codebase for a while, if you have any suggestions on how to improve AB3 (for future batches), feel free to post/discuss them in the forum.
    Examples: places where the design/code can be simplified, hard to understand parts of the code, tips you can share with future batches, ...

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +As this is a regular weekly task, the usual deadline applies i.e., Friday 1600, and as usual, if you miss the deadline, catching up within a few days will still turn it green.
  • Updating the DG text to match the diagrams is optional (it can be done later).
  • FYI, the panel below has some DG tips, some of which are related to drawing diagrams.
  • FAQ Why not wait till the end to add/update the DG diagrams?


    End of tP Week 10

    Have any suggestions to improve AB3?

    Now that you have worked with AB3 codebase for a while, if you have any suggestions on how to improve AB3 (for future batches), feel free to post/discuss them in the forum.
    Examples: places where the design/code can be simplified, hard to understand parts of the code, tips you can share with future batches, ...

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week10/project.page-vue-render.js b/schedule/week10/project.page-vue-render.js index 9afbed2eb0..fd217f18c8 100644 --- a/schedule/week10/project.page-vue-render.js +++ b/schedule/week10/project.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('p'),_v(" "),_m(1),_v(" "),_c('div',{staticClass:"lead border-left ml-3 mb-3 pl-2",staticStyle:{"color":"purple"},attrs:{"id":"summary"}},[_m(2),_v(" "),_c('div',[_c('ol',[_m(3),_v(" "),_m(4),_v(" "),_m(5),_v(" "),_c('li',[_m(6),_v(" "),_m(7),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1)]),_v(" "),_m(8)])])]),_v(" "),_m(9),_v(" "),_c('div',[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(10),_v(" "),_m(11),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"45%","y":"67%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.4")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to tweak the product/project plan to match the available time/resources.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Implement "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., "),_c('em',[_v("almost")]),_v(" complete implementation of the feature, even if not fully polished")]},proxy:true}])},[_v("fully-fledged")]),_v(" versions of "),_c('em',[_v("all")]),_v(" the features intended for final release.")],1)]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Add features based on priority, while maintaining a working product. It is OK if the features are rough around the edges, as they can be tweaked in the next iteration.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("In this iteration, we learn from past iterations, and aim to better plan and better deliver another functional increment")]),_v(" that would get you very very close to the final version in terms of raw functionality."),_c('br'),_v("\nWe call this the "),_c('em',[_v("alpha version")]),_v(" because "),_c('strong',[_v("this version is meant to be good enough for "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("testing done by internal testers")]},proxy:true}])},[_c('em',[_v("alpha testing")])])],1),_v(" of the product.")]),_v(" "),_m(12),_v(" "),_m(13),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How much code/features is enough to get full marks?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not surprisingly, a common question tutors receive is \"can you look at our project and tell us if we have done enough to get full marks?\". Here's the answer to that question:")]),_v(" "),_c('p',[_c('strong',[_v("The tP "),_c('em',[_v("effort")]),_v(" is graded primarily based on peer judgements")]),_v(" (tutor judgements are used too). That means you will be judging the effort of another team later, which also means you should be able to make a similar judgement for your own project now. While we understand effort estimating is hard for software projects, it is an essential SE skill, and we must practice it when we can.")]),_v(" "),_c('p',[_c('strong',[_v("The expected minimum bar to get full marks for "),_c('em',[_v("effort")])]),_v(" is given "),_c('trigger',{attrs:{"trigger":"click","for":"modal:mid13-effortBar"}},[_v(" here")]),_v(".")],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:mid13-effortBar"},scopedSlots:_u([{key:"header",fn:function(){return [_v("tP -> Expectations -> [Extract] Functionality Expectations")]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("The expected level of "),_c('em',[_v("functionality")]),_v(" is what you could achieve if each member puts in about "),_c('mark',[_v("50% of the implementation effort they put into the iP")])]),_v(" (reason for setting it much less than 100%: even after adding the extra overheads of doing the project as a team, and working with an exising codebase, we don't want the tP to take more effort than the iP)."),_c('br'),_v("\nFurthermore, we estimate that the above-mentioned bar is roughly "),_c('em',[_v("equivalent")]),_v(" to "),_c('strong',[_v("writing about 300-400 lines of functional code")]),_v(" (excluding testing and documentation) per person.")]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_v("In case you happen to look at tP's of past batches (2023 and before) in order to gauge the required effort, note that the above reflects a "),_c('mark',[_v("drastically lower bar from those semesters")]),_v(". For reference, the bar given to previous batches was 'same as iP effort' (not half), and the median LoC of functional code written by a student was about 850 LoC.")])])],1)]),_v(" "),_c('p',[_v("If you surpass the above bars (in your own estimation), you should be in a good position to receive full marks for the effort. But keep in mind that there are many other components in the "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_v("tP grading")]),_v(", not just the effort.")])],1)])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"warning","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Heads up: this is a BIG week of the tP!")])]},proxy:true}])},[_v(" "),_c('p',[_v("Ideally, the tP work should be distributed equally across all tP works. In practice though, this can be uneven based on your other commitments "),_c('span',{staticClass:"dimmed"},[_v("e.g., most did less work in week 7-8 due to midterm exams")]),_v(".")]),_v(" "),_c('p',[_c('mark',[_v("If you were to pick one tP week to push the hardest, this week should be it!")]),_v(" That is because in this iteration you need to implement all features that you plan to include in the final version (but they need not be fully polished).")])])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(14),_v(" "),_m(15),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(16),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Like to try a new Git workflow?")]),_v(" If you feel you are now comfortable with the forking workflow, and now you would like to practice another one, your team can choose to follow the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:postmortemTip-featurebranchworkflow"}},[_v("feature branch workflow")]),_v(" from now on.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:postmortemTip-featurebranchworkflow"},scopedSlots:_u([{key:"header",fn:function(){return [_v("TextBook "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Project Management → Revision Control →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"feature-branch-flow"}},[_c('span',[_v("Feature branch flow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-branch-flow","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Feature branch")]),_v(" workflow is similar to forking workflow except there are no forks.")]),_v(" Everyone is pushing/pulling from the same remote repo. The phrase "),_c('em',[_v("feature branch")]),_v(" is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.")]),_v(" "),_c('p',[_v("As this workflow require all team members to have write access to the repository,")]),_v(" "),_c('ul',[_c('li',[_v("it is better to "),_c('em',[_v("protect")]),_v(" the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.")]),_v(" "),_c('li',[_v("it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.")])]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/book/revisionControl/featureBranchFlow/images/diagram.png","height":"330"}}),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#feature-branch-workflow"}},[_v("A detailed explanation of the Feature Branch Workflow")]),_v(" - From Atlassian")])])])])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-plan-the-alpha-version-v1-4"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(17),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-plan-the-alpha-version-v1-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"secondary","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_v("The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.")])]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('small',[_v("--Tom Cargill, Bell Labs")])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide the scope:")]),_v(" Start by deciding what features you would include in the final product "),_c('span',{staticClass:"underline"},[_v("if you had only one more week to deliver")]),_v(" them. In this iteration, aim to deliver at least a "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the feature is working and accessible to users, although it might not handle all the corner cases, and the UI/UX might not be fully polished yet")]},proxy:true}])},[_v("fully-fledged (albeit not-yet-polished)")]),_v(" version of those features."),_c('br'),_v(" "),_m(18),_v(" We will be enforcing a strict "),_c('em',[_v("feature freeze")]),_v(" at the end of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(" (more details in the panel below). Given you also need time to polish the features before the feature freeze starts (during which feature tweaks are not allowed), it makes sense to finish the bulk of the feature implementation in this iteration ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.4")]),_v("), so that you have time to test and polish it in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(".")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_m(19)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(20),_v(" "),_m(21),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(22),_v(" "),_c('box',[_c('h5',{staticClass:"text-success",attrs:{"id":"ways-to-level-up-your-tp-game"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ways-to-level-up-your-tp-game","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('span',{staticClass:"text-success"},[_c('strong',[_v("Use parallel PRs:")])]),_v(" We encourage you to try sending parallel PRs (i.e., send another PR while the previous PR you sent is waiting to be merged) if you haven't done that yet. "),_c('span',{staticClass:"dimmed"},[_v("Reason: It's important to learn how to do that, because in most real projects it is common to have multiple open PRs from the same author.")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_v("Maintain the defensiveness of the code:")]),_v(" Use assertions, exceptions, and logging in your code, as well as other defensive programming measures (refer this week's topic on "),_c('em',[_v("defensive programming")]),_v(" for more details) when appropriate. This will be considered when grading your tP code quality."),_c('br'),_v("\nRemember to "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/intellijUsefulSettings.html"}},[_v("enable assertions in your IDEA run configurations")]),_v(" and "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/gradle.html#enabling-assertions"}},[_v("in the gradle file")]),_v(".")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_m(23),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Should we try to automate GUI testing as well?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Automated GUI testing is hard, especially in Desktop apps, especially in CI (because the environment that CI runs doesn't have a display device to show the GUI).")]),_v(" "),_c('p',[_v("A few years ago, we used "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(" as the starting point of the tP.")]),_v(" "),_c('ul',[_c('li',[_v("The main difference between AB4 and AB3? AB4 has automated GUI testing. It used the TestFX tool to do so, and ran the test in 'headless' mode in CI (i.e., simulate a display device without an actual display device).")]),_v(" "),_c('li',[_v("The main reason we changed tP to start with AB3 code was that some students found it too hard to maintain those GUI tests.")])]),_v(" "),_c('p',[_v("While we don't require you to automate GUI testing in your tP (i.e., it is fine to do only manual GUI testing), you are welcome to give it a try too, especially if you like a technical challenge.")]),_v(" "),_c('ul',[_c('li',[_v("Even if you get it working in only some OS'es only, and only in local environment, it is still a useful way to test the GUI quickly.")]),_v(" "),_c('li',[_v("It is possible to run tests selectively, which means you can still run them in environments they work and skip them in other environments.")])]),_v(" "),_c('p',[_v("Feel free to reuse/refer AB4 code too. If you manage to make some headway in this direction, you are encouraged to share it with others via the forum.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("All tests pass locally, but the same code fails CI in the PR. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("First, check which OS it is failing in. Some behaviors can be OS-dependent. For example, file paths are case-insensitive in Windows but not in Unix/Mac.")]),_v(" "),_c('p',[_v("Second, note that PR CI does a temporary merge of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to the PR branch before running tests, to verify if the checks will pass "),_c('em',[_v("after")]),_v(" you merge this PR. So, if the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has progressed after you started your PR branch, those new commits can affect the CI result. The remedy is to pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your repo, merge it to your PR branch, and run tests again (which should fail as well, but you can now find the reason for the failure and fix it).")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR passed CI before merging, but fails CI after merging. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("It is possible that the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has received new commits after your PR passed CI the last time. So, if GitHub indicates that your PR is not up-to-date with the latest "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, synchronize your PR branch with the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch (which will run the CI again) before merging it.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR CI fails because Codecov reports a drop in code coverage. What to do?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In some cases the code edited by the PR is not covered by existing tests, which means Codecov will report it as not adhering to the current coverage targets.")]),_v(" "),_c('p',[_v("First, find out which area of the code is causing the coverage drop. You can use Codecov or code coverage features of the IDE to do so.")]),_v(" "),_c('p',[_v("Then you can do the following:")]),_v(" "),_c('ul',[_c('li',[_v("Ignore those warnings, and merge the PR (a member with admin permissions can merge a CI-failing PR). Suitable for cases such as,\n"),_c('ul',[_c('li',[_v("the coverage drop is in code that is not normally covered by automated tests and/or 'not worth the effort to' test automatically (e.g., GUI).")]),_v(" "),_c('li',[_v("you deem that automated testing of that part of the code can be done at a later time (i.e., not a priority at the current time).")])])]),_v(" "),_c('li',[_v("Alternatively, update tests until the coverage is raised back to sufficient level.")])]),_v(" "),_c('p',[_v("Note that Codecov is there to help you manage code coverage -- it is not graded. You may lower the test coverage targets set for Codecov as well.")]),_v(" "),_c('p',[_v("For reference,")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p')])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Are we allowed to deviate from the MVP Feature Specification submitted earlier?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, the submitted "),_c('em',[_v("MVP Feature Specification")]),_v(" is not binding (its purpose was to get you to think about feature details early -- we will not be looking at it again). You may change features as needed along the way. Just ensure your changes do not violate "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("tp constraints")]),_v(".")]),_v(" "),_c('p',[_v("No need to resubmit the Feature Spec either. However, if you change the product name, target user, or the value proposition, (which is allowed too) please email the updated values to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(".")])])])],1)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(24),_v(" "),_m(25),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(26),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"dismissible":""}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" Some background:")]),_v(" As you know, our "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., Practical Exam")]},proxy:true}])},[_v("PE")]),_v(" includes peer-testing tP products under exam conditions. In the past, we used GitHub as the platform for that -- which was not optimal (e.g., it was hard to ensure the compulsory labels have been applied). As a remedy, some ex-students have been developing an app called "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("CAT stands for Crowd-sourced Anonymous Testing")]},proxy:true}])},[_v("CATcher")]),_v(" that we'll be using for the PE this semester. We still use GitHub to record bugs reported in the PE but CATcher acts as a layer between you and GitHub, to ensure the bugs you report meet PE requirements.")],1)])]),_v(" "),_m(27),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Steps for smoke-testing CATcher:")])])]},proxy:true}])},[_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Go to the CATcher Web version")]),_v(" at "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("https://catcher-org.github.io/CATcher/")]),_v(" using "),_c('mark',[_v("the same computer (i.e., not a mobile device) that you plan to use for the practical exam")]),_v(".\n"),_c('ul',[_c('li',[_v("Use a common browser such as Chrome, Edge, Firefox, Safari")]),_v(" "),_c('li',[_v("Allow popups from "),_c('a',{attrs:{"href":"https://catcher-org.github.io/"}},[_v("https://catcher-org.github.io/")])]),_v(" "),_c('li',[_v("If you encounter other problems at the app launch, refer to the "),_c('a',{attrs:{"href":"https://catcher-org.github.io/ug/"}},[_v("Notes on using CATcher")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("Login")]),_v(": Choose the "),_c('em',[_v("session")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T Smoke Test")]),_v(", and submit.\n"),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/catcherLogin.png"}})],1),_v(" "),_c('li',[_v("In the next screen, login to CATcher using your GitHub account."),_c('br'),_v("\nIf the app asks for public repo access permissions, grant it (just go with the default settings).")]),_v(" "),_c('li',[_c('strong',[_v("Let CATcher create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")])]),_v(" in your GitHub account, when it asks for permission. That repo will be used to hold the bug reports you will create in this testing session.")]),_v(" "),_c('li',[_c('strong',[_v("Use CATcher (not the GitHub Web/Mobile interface) to create 1-2 "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., bug reports containing some random content")]},proxy:true}])},[_v("dummy bug reports")])],1),_v(". The steps are similar to how you would enter bug reports in the GitHub issue tracker. Include at least one screenshot in one of those bug reports."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" you can "),_c('mark',[_v("copy-paste screenshots")]),_v(" into the bug description."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use Markdown syntax in the bug descriptions."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type")]),_v(" labels are compulsory.")]),_v(" "),_c('li',[_c('strong',[_v("Report any problems you encounter")]),_v(" at the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Do NOT delete the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")]),_v(" repo")]),_v(" created by CATcher in your GitHub account (keep it until the end of the semester) as our scripts will look for it later to check if you have done this activity.")])])]),_v(" "),_c('p')],1),_v(" "),_m(28)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-start-updating-uml-diagrams-in-the-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(29),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-start-updating-uml-diagrams-in-the-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("This is a good time to get familiar with the diagramming tools used by the tP.")])]),_v(" "),_m(30),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"light","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('div',{staticClass:"card-title"},[_c('p',[_c('span',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Deliverables → DG → Tips")])])])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)])]),_v(" "),_c('p')],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Why not wait till the end to add/update the DG diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Here are some reasons:")]),_v(" "),_c('ul',[_c('li',[_v("We want you to take at least two passes at documenting the project so that you can learn how to evolve the documentation along with the code "),_c('span',{staticClass:"dimmed"},[_v("(which requires additional considerations, when compared to documenting the project only once)")]),_v(".")]),_v(" "),_c('li',[_v("It is better to get used to the documentation tool chain early, to avoid unexpected problems near the final submission deadline.")]),_v(" "),_c('li',[_v("It allows receiving early self/peer/instructor feedback.")])])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_m(31)])])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#week-10-mon-oct-21st-project"}},[_v("Week 10 [Mon, Oct 21st] - Project‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-alpha-version-v1-4"}},[_v(" tP: Alpha version → v1.4 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-10"}},[_v("Intro to tP Week 10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_v("1 Do a postmortem of the previous iteration before the tutorial‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-plan-the-alpha-version-v1-4"}},[_v("2 Plan the alpha version (v1.4)‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_v("3 Deliver the alpha version (v1.4) Thu, Oct 24th 23:59‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_v("4 Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00 counted for participation‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-start-updating-uml-diagrams-in-the-dg"}},[_v("5 Start updating UML diagrams in the DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#end-of-tp-week-10"}},[_v("End of tP Week 10‎")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(32)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('p'),_v(" "),_m(1),_v(" "),_c('div',{staticClass:"lead border-left ml-3 mb-3 pl-2",staticStyle:{"color":"purple"},attrs:{"id":"summary"}},[_m(2),_v(" "),_c('div',[_c('ol',[_m(3),_v(" "),_m(4),_v(" "),_m(5),_v(" "),_c('li',[_m(6),_v(" "),_m(7),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1)]),_v(" "),_m(8)])])]),_v(" "),_m(9),_v(" "),_c('div',[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(10),_v(" "),_m(11),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"45%","y":"67%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.4")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to tweak the product/project plan to match the available time/resources.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Implement "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., "),_c('em',[_v("almost")]),_v(" complete implementation of the feature, even if not fully polished")]},proxy:true}])},[_v("fully-fledged")]),_v(" versions of "),_c('em',[_v("all")]),_v(" the features intended for final release.")],1)]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Add features based on priority, while maintaining a working product. It is OK if the features are rough around the edges, as they can be tweaked in the next iteration.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("In this iteration, we learn from past iterations, and aim to better plan and better deliver another functional increment")]),_v(" that would get you very very close to the final version in terms of raw functionality."),_c('br'),_v("\nWe call this the "),_c('em',[_v("alpha version")]),_v(" because "),_c('strong',[_v("this version is meant to be good enough for "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("testing done by internal testers")]},proxy:true}])},[_c('em',[_v("alpha testing")])])],1),_v(" of the product.")]),_v(" "),_m(12),_v(" "),_m(13),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How much code/features is enough to get full marks?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not surprisingly, a common question tutors receive is \"can you look at our project and tell us if we have done enough to get full marks?\". Here's the answer to that question:")]),_v(" "),_c('p',[_c('strong',[_v("The tP "),_c('em',[_v("effort")]),_v(" is graded primarily based on peer judgements")]),_v(" (tutor judgements are used too). That means you will be judging the effort of another team later, which also means you should be able to make a similar judgement for your own project now. While we understand effort estimating is hard for software projects, it is an essential SE skill, and we must practice it when we can.")]),_v(" "),_c('p',[_c('strong',[_v("The expected minimum bar to get full marks for "),_c('em',[_v("effort")])]),_v(" is given "),_c('trigger',{attrs:{"trigger":"click","for":"modal:mid13-effortBar"}},[_v(" here")]),_v(".")],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:mid13-effortBar"},scopedSlots:_u([{key:"header",fn:function(){return [_v("tP -> Expectations -> [Extract] Functionality Expectations")]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("The expected level of "),_c('em',[_v("functionality")]),_v(" is what you could achieve if each member puts in about "),_c('mark',[_v("50% of the implementation effort they put into the iP")])]),_v(" (reason for setting it much less than 100%: even after adding the extra overheads of doing the project as a team, and working with an exising codebase, we don't want the tP to take more effort than the iP)."),_c('br'),_v("\nFurthermore, we estimate that the above-mentioned bar is roughly "),_c('em',[_v("equivalent")]),_v(" to "),_c('strong',[_v("writing about 300-400 lines of functional code")]),_v(" (excluding testing and documentation) per person.")]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_v("In case you happen to look at tP's of past batches (2023 and before) in order to gauge the required effort, note that the above reflects a "),_c('mark',[_v("drastically lower bar from those semesters")]),_v(". For reference, the bar given to previous batches was 'same as iP effort' (not half), and the median LoC of functional code written by a student was about 850 LoC.")])])],1)]),_v(" "),_c('p',[_v("If you surpass the above bars (in your own estimation), you should be in a good position to receive full marks for the effort. But keep in mind that there are many other components in the "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_v("tP grading")]),_v(", not just the effort.")])],1)])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"warning","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Heads up: this is a BIG week of the tP!")])]},proxy:true}])},[_v(" "),_c('p',[_v("Ideally, the tP work should be distributed equally across all tP works. In practice though, this can be uneven based on your other commitments "),_c('span',{staticClass:"dimmed"},[_v("e.g., most did less work in week 7-8 due to midterm exams")]),_v(".")]),_v(" "),_c('p',[_c('mark',[_v("If you were to pick one tP week to push the hardest, this week should be it!")]),_v(" That is because in this iteration you need to implement all features that you plan to include in the final version (but they need not be fully polished).")])])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(14),_v(" "),_m(15),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(16),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Like to try a new Git workflow?")]),_v(" If you feel you are now comfortable with the forking workflow, and now you would like to practice another one, your team can choose to follow the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:postmortemTip-featurebranchworkflow"}},[_v("feature branch workflow")]),_v(" from now on.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:postmortemTip-featurebranchworkflow"},scopedSlots:_u([{key:"header",fn:function(){return [_v("TextBook "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_v("Project Management → Revision Control →\n")])])])]),_v(" "),_c('div',{attrs:{"id":"title-and-body"}},[_c('div',[_c('h4',{attrs:{"id":"feature-branch-flow"}},[_c('span',[_v("Feature branch flow")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-branch-flow","onclick":"event.stopPropagation()"}})])]),_v(" "),_c('div',{attrs:{"id":"main"}},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Feature branch")]),_v(" workflow is similar to forking workflow except there are no forks.")]),_v(" Everyone is pushing/pulling from the same remote repo. The phrase "),_c('em',[_v("feature branch")]),_v(" is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.")]),_v(" "),_c('p',[_v("As this workflow require all team members to have write access to the repository,")]),_v(" "),_c('ul',[_c('li',[_v("it is better to "),_c('em',[_v("protect")]),_v(" the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.")]),_v(" "),_c('li',[_v("it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.")])]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/book/revisionControl/featureBranchFlow/images/diagram.png","height":"330"}}),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('div',[_c('br'),_v(" "),_c('h5',{attrs:{"id":"resources"}},[_c('span',[_c('span',{staticClass:"fas fa-paperclip",attrs:{"aria-hidden":"true"}})]),_v(" Resources:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#resources","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://www.atlassian.com/git/tutorials/comparing-workflows#feature-branch-workflow"}},[_v("A detailed explanation of the Feature Branch Workflow")]),_v(" - From Atlassian")])])])])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-plan-the-alpha-version-v1-4"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(17),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-plan-the-alpha-version-v1-4","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"secondary","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-quote-left",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_v("The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time.")])]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('small',[_v("--Tom Cargill, Bell Labs")])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide the scope:")]),_v(" Start by deciding what features you would include in the final product "),_c('span',{staticClass:"underline"},[_v("if you had only one more week to deliver")]),_v(" them. In this iteration, aim to deliver at least a "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the feature is working and accessible to users, although it might not handle all the corner cases, and the UI/UX might not be fully polished yet")]},proxy:true}])},[_v("fully-fledged (albeit not-yet-polished)")]),_v(" version of those features."),_c('br'),_v(" "),_m(18),_v(" We will be enforcing a strict "),_c('em',[_v("feature freeze")]),_v(" at the end of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(" (more details in the panel below). Given you also need time to polish the features before the feature freeze starts (during which feature tweaks are not allowed), it makes sense to finish the bulk of the feature implementation in this iteration ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.4")]),_v("), so that you have time to test and polish it in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.5")]),_v(".")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_m(19)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(20),_v(" "),_m(21),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(22),_v(" "),_c('box',[_c('h5',{staticClass:"text-success",attrs:{"id":"ways-to-level-up-your-tp-game"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ways-to-level-up-your-tp-game","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ol',[_c('li',[_c('span',{staticClass:"text-success"},[_c('strong',[_v("Use parallel PRs:")])]),_v(" We encourage you to try sending parallel PRs (i.e., send another PR while the previous PR you sent is waiting to be merged) if you haven't done that yet. "),_c('span',{staticClass:"dimmed"},[_v("Reason: It's important to learn how to do that, because in most real projects it is common to have multiple open PRs from the same author.")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_v("Maintain the defensiveness of the code:")]),_v(" Use assertions, exceptions, and logging in your code, as well as other defensive programming measures (refer this week's topic on "),_c('em',[_v("defensive programming")]),_v(" for more details) when appropriate. This will be considered when grading your tP code quality."),_c('br'),_v("\nRemember to "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/intellijUsefulSettings.html"}},[_v("enable assertions in your IDEA run configurations")]),_v(" and "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/gradle.html#enabling-assertions"}},[_v("in the gradle file")]),_v(".")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_m(23),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Should we try to automate GUI testing as well?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Automated GUI testing is hard, especially in Desktop apps, especially in CI (because the environment that CI runs doesn't have a display device to show the GUI).")]),_v(" "),_c('p',[_v("A few years ago, we used "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(" as the starting point of the tP.")]),_v(" "),_c('ul',[_c('li',[_v("The main difference between AB4 and AB3? AB4 has automated GUI testing. It used the TestFX tool to do so, and ran the test in 'headless' mode in CI (i.e., simulate a display device without an actual display device).")]),_v(" "),_c('li',[_v("The main reason we changed tP to start with AB3 code was that some students found it too hard to maintain those GUI tests.")])]),_v(" "),_c('p',[_v("While we don't require you to automate GUI testing in your tP (i.e., it is fine to do only manual GUI testing), you are welcome to give it a try too, especially if you like a technical challenge.")]),_v(" "),_c('ul',[_c('li',[_v("Even if you get it working in only some OS'es only, and only in local environment, it is still a useful way to test the GUI quickly.")]),_v(" "),_c('li',[_v("It is possible to run tests selectively, which means you can still run them in environments they work and skip them in other environments.")])]),_v(" "),_c('p',[_v("Feel free to reuse/refer AB4 code too. If you manage to make some headway in this direction, you are encouraged to share it with others via the forum.")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("All tests pass locally, but the same code fails CI in the PR. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("First, check which OS it is failing in. Some behaviors can be OS-dependent. For example, file paths are case-insensitive in Windows but not in Unix/Mac.")]),_v(" "),_c('p',[_v("Second, note that PR CI does a temporary merge of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to the PR branch before running tests, to verify if the checks will pass "),_c('em',[_v("after")]),_v(" you merge this PR. So, if the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has progressed after you started your PR branch, those new commits can affect the CI result. The remedy is to pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your repo, merge it to your PR branch, and run tests again (which should fail as well, but you can now find the reason for the failure and fix it).")])])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR passed CI before merging, but fails CI after merging. How come?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("It is possible that the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch has received new commits after your PR passed CI the last time. So, if GitHub indicates that your PR is not up-to-date with the latest "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, synchronize your PR branch with the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch (which will run the CI again) before merging it.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("PR CI fails because Codecov reports a drop in code coverage. What to do?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In some cases the code edited by the PR is not covered by existing tests, which means Codecov will report it as not adhering to the current coverage targets.")]),_v(" "),_c('p',[_v("First, find out which area of the code is causing the coverage drop. You can use Codecov or code coverage features of the IDE to do so.")]),_v(" "),_c('p',[_v("Then you can do the following:")]),_v(" "),_c('ul',[_c('li',[_v("Ignore those warnings, and merge the PR (a member with admin permissions can merge a CI-failing PR). Suitable for cases such as,\n"),_c('ul',[_c('li',[_v("the coverage drop is in code that is not normally covered by automated tests and/or 'not worth the effort to' test automatically (e.g., GUI).")]),_v(" "),_c('li',[_v("you deem that automated testing of that part of the code can be done at a later time (i.e., not a priority at the current time).")])])]),_v(" "),_c('li',[_v("Alternatively, update tests until the coverage is raised back to sufficient level.")])]),_v(" "),_c('p',[_v("Note that Codecov is there to help you manage code coverage -- it is not graded. You may lower the test coverage targets set for Codecov as well.")]),_v(" "),_c('p',[_v("For reference,")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p')])])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Are we allowed to deviate from the MVP Feature Specification submitted earlier?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, the submitted "),_c('em',[_v("MVP Feature Specification")]),_v(" is not binding (its purpose was to get you to think about feature details early -- we will not be looking at it again). You may change features as needed along the way. Just ensure your changes do not violate "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("tp constraints")]),_v(".")]),_v(" "),_c('p',[_v("No need to resubmit the Feature Spec either. However, if you change the product name, target user, or the value proposition, (which is allowed too) please email the updated values to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(".")])])])],1)],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(24),_v(" "),_m(25),_v(" "),_c('span',{staticClass:"text-info"},[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("counted for participation")]},proxy:true}])},[_c('span',[_c('span',{staticClass:"fab fa-product-hunt",attrs:{"aria-hidden":"true"}})])])],1),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(26),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"dismissible":""}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" Some background:")]),_v(" As you know, our "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., Practical Exam")]},proxy:true}])},[_v("PE")]),_v(" includes peer-testing tP products under exam conditions. In the past, we used GitHub as the platform for that -- which was not optimal (e.g., it was hard to ensure the compulsory labels have been applied). As a remedy, some ex-students have been developing an app called "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("CAT stands for Crowd-sourced Anonymous Testing")]},proxy:true}])},[_v("CATcher")]),_v(" that we'll be using for the PE this semester. We still use GitHub to record bugs reported in the PE but CATcher acts as a layer between you and GitHub, to ensure the bugs you report meet PE requirements.")],1)])]),_v(" "),_m(27),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Steps for smoke-testing CATcher:")])])]},proxy:true}])},[_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Go to the CATcher Web version")]),_v(" at "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("https://catcher-org.github.io/CATcher/")]),_v(" using "),_c('mark',[_v("the same computer (i.e., not a mobile device) that you plan to use for the practical exam")]),_v(".\n"),_c('ul',[_c('li',[_v("Use a common browser such as Chrome, Edge, Firefox, Safari")]),_v(" "),_c('li',[_v("Allow popups from "),_c('a',{attrs:{"href":"https://catcher-org.github.io/"}},[_v("https://catcher-org.github.io/")])]),_v(" "),_c('li',[_v("If you encounter other problems at the app launch, refer to the "),_c('a',{attrs:{"href":"https://catcher-org.github.io/ug/"}},[_v("Notes on using CATcher")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("Login")]),_v(": Choose the "),_c('em',[_v("session")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T Smoke Test")]),_v(", and submit.\n"),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/catcherLogin.png"}})],1),_v(" "),_c('li',[_v("In the next screen, login to CATcher using your GitHub account."),_c('br'),_v("\nIf the app asks for public repo access permissions, grant it (just go with the default settings).")]),_v(" "),_c('li',[_c('strong',[_v("Let CATcher create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")])]),_v(" in your GitHub account, when it asks for permission. That repo will be used to hold the bug reports you will create in this testing session.")]),_v(" "),_c('li',[_c('strong',[_v("Use CATcher (not the GitHub Web/Mobile interface) to create 1-2 "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., bug reports containing some random content")]},proxy:true}])},[_v("dummy bug reports")])],1),_v(". The steps are similar to how you would enter bug reports in the GitHub issue tracker. Include at least one screenshot in one of those bug reports."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" you can "),_c('mark',[_v("copy-paste screenshots")]),_v(" into the bug description."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use Markdown syntax in the bug descriptions."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type")]),_v(" labels are compulsory.")]),_v(" "),_c('li',[_c('strong',[_v("Report any problems you encounter")]),_v(" at the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Do NOT delete the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catcher-smoke-test")]),_v(" repo")]),_v(" created by CATcher in your GitHub account (keep it until the end of the semester) as our scripts will look for it later to check if you have done this activity.")])])]),_v(" "),_c('p')],1),_v(" "),_m(28)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-start-updating-uml-diagrams-in-the-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(29),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-start-updating-uml-diagrams-in-the-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("This is a good time to get familiar with the diagramming tools used by the tP.")])]),_v(" "),_m(30),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"light","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('div',{staticClass:"card-title"},[_c('p',[_c('span',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Deliverables → DG → Tips")])])])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)])]),_v(" "),_c('p')],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Why not wait till the end to add/update the DG diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Here are some reasons:")]),_v(" "),_c('ul',[_c('li',[_v("We want you to take at least two passes at documenting the project so that you can learn how to evolve the documentation along with the code "),_c('span',{staticClass:"dimmed"},[_v("(which requires additional considerations, when compared to documenting the project only once)")]),_v(".")]),_v(" "),_c('li',[_v("It is better to get used to the documentation tool chain early, to avoid unexpected problems near the final submission deadline.")]),_v(" "),_c('li',[_v("It allows receiving early self/peer/instructor feedback.")])])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_m(31)])])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#week-10-mon-oct-21st-project"}},[_v("Week 10 [Mon, Oct 21st] - Project‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-alpha-version-v1-4"}},[_v(" tP: Alpha version → v1.4 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-10"}},[_v("Intro to tP Week 10‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-do-a-postmortem-of-the-previous-iteration-before-the-tutorial"}},[_v("1 Do a postmortem of the previous iteration before the tutorial‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-plan-the-alpha-version-v1-4"}},[_v("2 Plan the alpha version (v1.4)‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-deliver-the-alpha-version-v1-4-thu-oct-24th-23-59"}},[_v("3 Deliver the alpha version (v1.4) Thu, Oct 24th 23:59‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-smoke-test-catcher-compulsory-fri-oct-25th-16-00-counted-for-participation"}},[_v("4 Smoke-test CATcher [COMPULSORY] Fri, Oct 25th 16:00 counted for participation‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-start-updating-uml-diagrams-in-the-dg"}},[_v("5 Start updating UML diagrams in the DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#end-of-tp-week-10"}},[_v("End of tP Week 10‎")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(32)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -101,6 +101,6 @@ with(this){return _c('ul',[_c('li',[_c('span',[_c('span',{staticClass:"fas fa-us with(this){return _c('div',[_c('div',{staticClass:"border border-success pt-2 ps-2 pe-1 border-top-0 rounded-bottom",staticStyle:{"background-color":"#e6fff2"}},[_c('h4',{attrs:{"id":"end-of-tp-week-10"}},[_c('strong',[_c('strong',[_v("End of tP Week 10")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#end-of-tp-week-10","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',{staticClass:"text-info"},[_v("Have any suggestions to improve AB3?")])]),_v(" "),_c('p',[_v("Now that you have worked with AB3 codebase for a while, if you have any suggestions on how to improve AB3 (for future batches), feel free to post/discuss them in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Examples: places where the design/code can be simplified, hard to understand parts of the code, tips you can share with future batches, ...")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week10/topics.html b/schedule/week10/topics.html index 3e6d70a62b..eb63b3e828 100644 --- a/schedule/week10/topics.html +++ b/schedule/week10/topics.html @@ -359,7 +359,7 @@ [“F”]
    [“A”, “D”, “X”]

    No specific boundary
    No specific boundary
    -No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week10/topics.page-vue-render.js b/schedule/week10/topics.page-vue-render.js index a8df14b9bc..fc7fe3f6bc 100644 --- a/schedule/week10/topics.page-vue-render.js +++ b/schedule/week10/topics.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week10/tutorial.html b/schedule/week10/tutorial.html index 3d624bf8e3..9a6a4d30bb 100644 --- a/schedule/week10/tutorial.html +++ b/schedule/week10/tutorial.html @@ -28,7 +28,7 @@
    • Omit less important details. Examples:
      • a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.
      • a sequence diagram can omit less important interactions, self-calls, method parameters, etc.
        You can use ... (e.g., foo(...)) to indicate parameters have been omitted.
        You can use pseudocode instead of exact method calls e.g., save data in file instead of saveData(content, filename).
        Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling (throw/catch), lambdas, calls to anonymous methods, etc.
        If you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.
    • Omit repetitive details e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the AB3 Logic class diagram shows concrete *Command classes using a placeholder XYZCommand).
    • Limit the scope of a diagram. Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it. In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the this sequence diagram shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.
    • Break diagrams into smaller fragments when possible. -
      • If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.
      • You can use ref frames to break sequence diagrams to multiple diagrams. Similarly, rakes can be used to divide activity diagrams.
    • Stay at the highest level of abstraction possible e.g., note how this sequence diagram shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.
    • Use visual representations as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.
    • For some more examples of what NOT to do, see here.
  • Integrate diagrams into the description. Place the diagram close to where it is being described.
  • Use code snippets sparingly. The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.
  • Resize diagrams so that the text size in the diagram matches the text size of the main text of the diagram. See example.

    • During the tutorial, the tutor will ask you for the observations you've noted down.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.
    • You can use ref frames to break sequence diagrams to multiple diagrams. Similarly, rakes can be used to divide activity diagrams.
  • Stay at the highest level of abstraction possible e.g., note how this sequence diagram shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.
  • Use visual representations as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.
  • For some more examples of what NOT to do, see here.
  • Integrate diagrams into the description. Place the diagram close to where it is being described.
  • Use code snippets sparingly. The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.
  • Resize diagrams so that the text size in the diagram matches the text size of the main text of the diagram. See example.

    • During the tutorial, the tutor will ask you for the observations you've noted down.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week10/tutorial.page-vue-render.js b/schedule/week10/tutorial.page-vue-render.js index d366c95e15..4b39437465 100644 --- a/schedule/week10/tutorial.page-vue-render.js +++ b/schedule/week10/tutorial.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('ul',[_c('li',[_v("Also, lookout for places where these tip with(this){return _c('ul',[_c('li',[_v("During the tutorial, the tutor will ask you for the observations you've noted down.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week11/admin.html b/schedule/week11/admin.html index dbf0fa6a44..a44a5f6523 100644 --- a/schedule/week11/admin.html +++ b/schedule/week11/admin.html @@ -13,7 +13,7 @@ +weekly briefing).

    + Other info relevant to this week:

    Admin Exams

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week11/admin.page-vue-render.js b/schedule/week11/admin.page-vue-render.js index f77282d79e..4d372a8988 100644 --- a/schedule/week11/admin.page-vue-render.js +++ b/schedule/week11/admin.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"week-11-mon-oct-28th-admin"}},[_v("Week with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',[_v("Weekly quiz")]),_v(": Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline "),_c('span',{staticClass:"dimmed"},[_v("(i.e., before the following\nweekly briefing)")]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week11/index.html b/schedule/week11/index.html index 06a9a5d4cd..35c544d71b 100644 --- a/schedule/week11/index.html +++ b/schedule/week11/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 11 [Mon, Oct 28th] - Summary

    Due to holidays, this week's tutorial is released as a pre-recorded video.

    It is available in the Tutorial page.

    Topics:

    • [W11.1] More Design Patterns

    • [W11.2] Architectural Styles

    • [W11.3] Test Cases: Combining Multiple Inputs

    • [W11.4] Other QA Techniques

    • [W11.7] Other UML Models : OPTIONAL

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.5

    1. Alpha-test the product
    2. Fix alpha-test bugs, fine-tune features
    3. Update UG and DG
    4. Release v1.5 Thu, Nov 7th 23:59

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 11 [Mon, Oct 28th] - Summary

    Due to holidays, this week's tutorial is released as a pre-recorded video.

    It is available in the Tutorial page.

    Topics:

    • [W11.1] More Design Patterns

    • [W11.2] Architectural Styles

    • [W11.3] Test Cases: Combining Multiple Inputs

    • [W11.4] Other QA Techniques

    • [W11.7] Other UML Models : OPTIONAL

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.5

    1. Alpha-test the product
    2. Fix alpha-test bugs, fine-tune features
    3. Update UG and DG
    4. Release v1.5 Thu, Nov 7th 23:59

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week11/index.page-vue-render.js b/schedule/week11/index.page-vue-render.js index aae86b433b..ed6f36540f 100644 --- a/schedule/week11/index.page-vue-render.js +++ b/schedule/week11/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Admin:")])])} with(this){return _c('div',[_c('p',[_c('strong',[_v("tP:")]),_v(" "),_c('span',{staticClass:"border rounded text-success border-success pe-1 ps-1"},[_c('span',{staticClass:"fas fa-tag",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("v1.5")])])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Alpha-test the product")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Fix alpha-test bugs, fine-tune features")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Update UG and DG")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Release v1.5")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Thu, Nov 7th 23:59")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week11/project.html b/schedule/week11/project.html index 6a8ed02cb2..6bec020c80 100644 --- a/schedule/week11/project.html +++ b/schedule/week11/project.html @@ -25,7 +25,7 @@
    • Remove mentions of any features not implemented yet, if any. As you are not allowed to change features during the iteration v1.6, there is no point keeping those in the UG.
      Alternatively, clearly indicate which features are not implemented yet e.g. tag those features with a Coming soon.
    • For those features already implemented, ensure their descriptions match the exact behavior of the product e.g. replace mockups with actual screenshots

    • Save the UG as a PDF file using this technique exactly. You'll need this file later when you create a product release. There is no specific file name convention for this version of the UG, but do use a reasonable file name: e.g., Contacts-Pro-User-Guide.pdf.

    • Similarly, update the Developer Guide (DG), and save it as PDF file.

    • Update the landing page (docs/index.md): Update to look like a real product (rather than a project for learning SE) if you haven't done so already. In particular, update the Ui.png to match the current product ( tips).

    4 Release v1.5 Thu, Nov 7th 23:59

    • Do a as described in the Developer Guide. Do the release by the given deadline.
      Do a smoke-test to ensure the jar file works (if the released jar file is broken, it will be omitted from the PE-D).
      • Include the following files in the release (as separate assets):
        1. JAR file
        2. UG (PDF file) -- uploaded as an 'asset' (similar to the JAR file), not embedded in the release note.
        3. DG (PDF file) -- similar to the UG
      • You may choose any suitable filename, but recommended not to have spaces or special characters in the JAR file name.
      • It is optional to write detailed release notes for this version.
    • You can do an additional release before the PE dry run (PE-D) if you wish, as long as you do it before 10 am Friday. That additional release is still considered part of v1.5 and therefore, not subjected to the feature freeze. When doing this additional release, do not delete the previous release (reason: it is good to preserver the release history) -- testers are expected to test the latest release file anyway. You may use any suitable version number for this JAR file e.g., v1.5.1.
      -Waiting till Friday 10am to release the v1.5 is strongly discouraged because if you miss that deadline, your team will not be able to benefit from the PE-D at all. It is better to have an earlier release to fall back on in case that happens.
    • The feature freeze will apply at the point you released the JAR file that was used in the PE-D i.e., the features submitted in the final v1.6 later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.
    • As before, wrap up the milestone (i.e., reschedule/close any remaining issues/PRs and close the milestone).

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Waiting till Friday 10am to release the v1.5 is strongly discouraged because if you miss that deadline, your team will not be able to benefit from the PE-D at all. It is better to have an earlier release to fall back on in case that happens.
  • The feature freeze will apply at the point you released the JAR file that was used in the PE-D i.e., the features submitted in the final v1.6 later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.
  • As before, wrap up the milestone (i.e., reschedule/close any remaining issues/PRs and close the milestone).
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week11/project.page-vue-render.js b/schedule/week11/project.page-vue-render.js index ddb4edae6e..b0aed0ac68 100644 --- a/schedule/week11/project.page-vue-render.js +++ b/schedule/week11/project.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('p'),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_c('div',[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(4),_v(" "),_m(5),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"60%","y":"80%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.5")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to apply internal quality control.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the "),_c('em',[_v("release candidate (RC)")]),_v(" version, ready for a public beta testing (i.e., the product quality should be sufficiently high "),_c('span',{staticClass:"dimmed"},[_v("e.g., no obvious bugs")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Do an "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("A full-product testing conducted by internal testers (in this case, project members themselves) acting as target users")]},proxy:true}])},[_v("alpha test")]),_v(" internally, and refine features as necessary. Improve tests, documentation, code quality.")],1)])])])]),_v(" "),_m(6),_v(" "),_m(7),_v(" "),_c('div',[_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("This iteration is normally done in one week, but is spread over two weeks")]),_v(" due to clashes with holidays. So, do the amount of work you would normally do if this was only one week long (i.e., no need to do more work because there is an extra week for this iteration).")]),_v(" "),_c('p',[_c('strong',[_v("The "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html"}},[_v("tP progress dashboard")]),_v(" will stay in Week 11 for an extra week")]),_v(" (i.e., even when we are in Week 12), to reflect that you can use Week 12 to do Week 11 tP tasks "),_c('span',{staticClass:"dimmed"},[_v("i.e., pending Week 11 tasks will not turn red until end of week 12")]),_v(".")])])],1),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of the project grading criteria")]),_v(":")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","popup-url":"tp-grading.html","collapsed":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("tP → Grading")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Note that project grading is "),_c('mark',[_v("not competitive (not bell curved)")]),_v("."),_c('span',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_v("\nCS2103T projects will be assessed separately from CS2103 projects.")]),_v(" Given below is the marking scheme.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Total")])]),_v(": 50 marks ("),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 45 individual marks + "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 team marks)")]),_v(" "),_c('p',[_v("See the sections below for details of how we assess each aspect.")]),_v(" "),_c('div',{attrs:{"id":"criteria-productDesign"}},[_c('h4',{attrs:{"id":"1-project-grading-product-design-5-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("1. Project Grading: Product Design "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-project-grading-product-design-5-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")])]),_v(" "),_c('ul',[_c('li',[_v("how well your features "),_c('em',[_v("fit together")]),_v(" to form a cohesive product"),_c('br'),_v("\n(not how many features or how big/novel/interesting/difficult the features are)")]),_v(" "),_c('li',[_v("how well it "),_c('em',[_v("matches the target user")])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluated by:")])]),_v(" "),_c('ul',[_c('li',[_v("the teaching team (based on product demo and user guide)")]),_v(" "),_c('li',[_v("peers from other teams (based on peer testing and user guide)")])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Product Design")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])])]),_v(" "),_c('p'),_v(" "),_c('p',[_v("In addition, feature flaws reported in the PE will be considered when grading this aspect.")]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1)]),_v(" "),_c('div',{attrs:{"id":"grading-implementation"}},[_c('h4',{attrs:{"id":"2-project-grading-implementation-15-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("2. Project Grading: Implementation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 15 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-project-grading-implementation-15-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2A. Code quality")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" the quality of the parts of the code you claim as written by you")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")]),_v(" manual inspection by tutors + automated-analysis by a script")]),_v(" "),_c('p',[_c('strong',[_v("Criteria:")])]),_v(" "),_c('span',{attrs:{"id":"projectGrading-codeQuality-criteria"}},[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2B. Effort")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" how much value you contributed to the product")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_v("Step 1: Evaluate the effort for the entire project. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Questions used for Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the product implementation (excluding UG, DG, and team-based tasks) is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Baseline: If your team received a value higher than "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(" in step 1 and the team agrees that you did roughly an equal share of implementation work, you should receive full marks for effort.")])])])]),_v(" "),_c('h4',{attrs:{"id":"3-project-grading-qa-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("3. Project Grading: QA "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-project-grading-qa-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('big',[_c('strong',[_v("3A. Developer Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you tested your own feature")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")])]),_v(" "),_c('ol',[_c('li',[_v("functionality bugs in your work found by others during the "),_c('a',{attrs:{"href":"/website/admin/tp-pe.html#tp-practical-exam"}},[_v("Practical Exam (PE)")])]),_v(" "),_c('li',[_v("your test code "),_c('span',{staticClass:"dimmed"},[_v("(note "),_c('trigger',{attrs:{"trigger":"click","for":"modal:projectGradingQA-testingExpectations"}},[_v("our expectations for automated testing")]),_v(")")],1)])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:projectGradingQA-testingExpectations"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Our expectations for automated testing in the project")]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("3B. System/Acceptance Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you can system-test/acceptance-test a product")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" bugs you found in the PE. In addition to functionality bugs, you get credit for reporting documentation bugs and feature flaws.")]),_v(" "),_c('box',[_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_v(" "),_c('div',{attrs:{"id":"criteria-documentation"}},[_c('h4',{attrs:{"id":"4-project-grading-documentation-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("4. Project Grading: Documentation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-project-grading-documentation-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluates:")]),_v(" your contribution to project documents")]),_v(" "),_c('p',[_c('strong',[_v("Method:")]),_v(" Evaluated in two steps.")]),_v(" "),_c('ul',[_c('li',[_v("Step 1: Evaluate the whole UG and DG. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the UG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the User Guide is,")])],1),_v(" "),_c('span',{attrs:{"id":"equalShareScale"}},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the DG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the Developer Guide is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("In addition, UG and DG bugs you received in the PE will be considered for grading this component.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1)])]),_v(" "),_c('h4',{attrs:{"id":"5-project-grading-project-management-5-5-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("5. Project Grading: Project Management "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 + "),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 = 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-project-grading-project-management-5-5-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"project-management-grading"}},[_c('p',[_c('big',[_c('strong',[_v("5A. Process:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you did in project management related aspects of the project, as an individual and as a team")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" tutor/grading-script observations of project milestones and GitHub data")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Project done iteratively and incrementally "),_c('span',{staticClass:"dimmed"},[_v("(opposite: doing most of the work in one big burst)")])])]),_v(" "),_c('li',[_c('p',[_v("Project tasks done on time (to get a good grade for this aspect, finish at least 75% of the tasks by the deadline).")])]),_v(" "),_c('li',[_c('p',[_v("Good use of these GitHub mechanisms:")]),_v(" "),_c('ul',[_c('li',[_v("milestones")]),_v(" "),_c('li',[_v("releases")]),_v(" "),_c('li',[_v("issue tracker (with good task definition, assignment, and tracking)")]),_v(" "),_c('li',[_v("PRs, and PR reviews")])])]),_v(" "),_c('li',[_c('p',[_v("Good version control, based on the repo.")])]),_v(" "),_c('li',[_c('p',[_v("Reasonable attempt to use the prescribed workflows.")])]),_v(" "),_c('li',[_c('p',[_v("Good use of buffers "),_c('span',{staticClass:"dimmed"},[_v("(opposite: everything at the last minute)")]),_v(".")])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("5B. Team-tasks:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How much you contributed to team-tasks")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Expectations: Examples of team-tasks "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" peer evaluations, tutor observations")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")]),_v(" Do the following to get a good grade for this aspect:")]),_v(" "),_c('ul',[_c('li',[_v("Do close to an equal share of the team tasks.")]),_v(" "),_c('li',[_v("Have commits in four of weeks 7, 8, 9, 10, 11, 12")])])])])])],1)],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-alpha-test-the-product"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(8),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-alpha-test-the-product","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(9),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding",attrs:{"type":"","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam (Extract) → "),_c('strong',[_v("Steps for testing a tP JAR file")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])])])],1),_c('p'),_v(" "),_c('ol',{attrs:{"start":"4"}},[_c('li',[_c('strong',[_v("Report bugs")]),_v(" you found, and "),_c('mark',[_v("even suggestions for improvements")]),_v(".\n"),_c('ul',[_c('li',[_v("If in doubt, report anyway.")]),_v(" "),_m(10),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" For this individual tP tasks to be marked as done, you need to submit at least 5 issues labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("alpha-bug")]),_v(".")])])])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("If you want to smoke-test your JAR file on an OS not available within your team, you can post a request in the forum to see if anyone else in the class can help you smoke-test it on that OS.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("The panel below contains guidelines your peers will use when determining bugs in the final product -- knowing them might be useful in preventing such bugs in your product in the first place. You may skip the 'General' section.")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam → "),_c('strong',[_v("Guidelines for determining bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_c('p')]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Some testing tips to get you started (not an exhaustive list)...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("If your app references date/time of the computer it is running on (e.g., to calculate time elapsed), test if it can work if the computer date/time is configured to be in different formats -- different computers might use different date formats.")]),_v(" "),_c('li',[_v("Test against all typical user mistakes "),_c('span',{staticClass:"dimmed"},[_v("e.g., typing two spaces instead of one")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-fix-alpha-test-bugs-fine-tune-features"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(11),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-fix-alpha-test-bugs-fine-tune-features","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(12),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Consider increasing test coverage")]),_v(" by adding more tests if it is lower than the level you would like it to be. Take note of our expectation on test code (given in the panel below).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("After you have sufficient code coverage, fix remaining code quality problems")]),_v(" and bring up the quality to your target level. Note that the quality of the code attributed to you accounts for a significant component of your final score, graded individually (based on the code attributed to you by the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP code dashboard")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Code Quality Tips")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])])])],1),_c('p')])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Must we fix all bugs reported and all enhancements suggested by testers?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not necessarily. Choose based on importance.")]),_v(" "),_c('p',[_v("In any project, there are always things that can be done 'if there was more time'. If fixing a certain bug has low impact on users, and fixing it is not as important as the work done (or intend to do in the current iteration), you can justify not fixing it with the reason 'not in scope' of the current iteration.")]),_v(" "),_c('p',[_v("Similarly, a missing feature enhancement can be justified as 'not in scope' if implementing that could have taken resources away from other important project tasks.")]),_v(" "),_c('p',[_v("Bugs and possible enhancements 'not in scope' will not be penalized.")])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-update-ug-and-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(13),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-update-ug-and-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Update the User Guide")]),_v(" to match the current version of the product. "),_c('span',{staticClass:"dimmed"},[_v("Reason: testers will need to refer to the UG during the practical exam dry run")]),_v(".\n"),_m(14)])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(15),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("Caution on PDF conversions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-PDF-Friendly")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-pdf-friendly"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-PDF-Friendly")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-pdf-friendly","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The DG and UG should be PDF-friendly. Don't use expandable panels, embedded videos, animated GIFs etc. "),_c('br')]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" The UG and DG used in the final grading will be in PDF format")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-File-Size")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p'),_v(" "),_m(16),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_m(17),_v(": Update to look like a real product (rather than a project for learning SE) if you haven't done so already. In particular, "),_c('mark',[_v("update the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" to match the current product ("),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-tipsForProductScreenshot"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" tips")]),_v(")")],1),_v(".")])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-tipsForProductScreenshot"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin → Project Deliverables → Website -> Tips for Product Screenshots")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-release-v1-5-thu-nov-7th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(18),_v(" "),_m(19),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-release-v1-5-thu-nov-7th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Do a "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("resulting in a jar file on GitHub that can be downloaded by potential users")]},proxy:true}])},[_v("proper product release")])],1),_v(" "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp/DevOps.html#making-a-release"}},[_v("as described in the Developer Guide")]),_v(". Do the release by the given deadline. "),_c('br'),_v(" "),_c('mark',[_v("Do a smoke-test to ensure the jar file works")]),_v(" (if the released jar file is broken, it will be omitted from the PE-D)."),_c('br'),_v(" "),_m(20)]),_v(" "),_m(21),_v(" "),_c('li',[_c('strong',[_v("The "),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-jar-desc"}},[_c('em',[_v("feature freeze")])]),_v(" will apply at the point you released the JAR file that was used in the PE-D")],1),_v(" i.e., the features submitted in the final "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.6")]),_v(" later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.")]),_v(" "),_m(22)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-jar-desc"},scopedSlots:_u([{key:"header",fn:function(){return undefined},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)])],1),_v(" "),_c('p'),_v(" "),_c('div')])])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#week-11-mon-oct-28th-project"}},[_v("Week 11 [Mon, Oct 28th] - Project‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-release-candidate-v1-5"}},[_v(" tP: Release candidate → v1.5 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-11"}},[_v("Intro to tP Week 11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-alpha-test-the-product"}},[_v("1 Alpha-test the product‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-fix-alpha-test-bugs-fine-tune-features"}},[_v("2 Fix alpha-test bugs, fine-tune features‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-update-ug-and-dg"}},[_v("3 Update UG and DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-release-v1-5-thu-nov-7th-23-59"}},[_v("4 Release v1.5 Thu, Nov 7th 23:59‎")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(23)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('p'),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_c('div',[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(4),_v(" "),_m(5),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"60%","y":"80%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.5")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to apply internal quality control.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the "),_c('em',[_v("release candidate (RC)")]),_v(" version, ready for a public beta testing (i.e., the product quality should be sufficiently high "),_c('span',{staticClass:"dimmed"},[_v("e.g., no obvious bugs")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Do an "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("A full-product testing conducted by internal testers (in this case, project members themselves) acting as target users")]},proxy:true}])},[_v("alpha test")]),_v(" internally, and refine features as necessary. Improve tests, documentation, code quality.")],1)])])])]),_v(" "),_m(6),_v(" "),_m(7),_v(" "),_c('div',[_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("This iteration is normally done in one week, but is spread over two weeks")]),_v(" due to clashes with holidays. So, do the amount of work you would normally do if this was only one week long (i.e., no need to do more work because there is an extra week for this iteration).")]),_v(" "),_c('p',[_c('strong',[_v("The "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html"}},[_v("tP progress dashboard")]),_v(" will stay in Week 11 for an extra week")]),_v(" (i.e., even when we are in Week 12), to reflect that you can use Week 12 to do Week 11 tP tasks "),_c('span',{staticClass:"dimmed"},[_v("i.e., pending Week 11 tasks will not turn red until end of week 12")]),_v(".")])])],1),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of the project grading criteria")]),_v(":")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","popup-url":"tp-grading.html","collapsed":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("tP → Grading")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Note that project grading is "),_c('mark',[_v("not competitive (not bell curved)")]),_v("."),_c('span',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_v("\nCS2103T projects will be assessed separately from CS2103 projects.")]),_v(" Given below is the marking scheme.")]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Total")])]),_v(": 50 marks ("),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 45 individual marks + "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 team marks)")]),_v(" "),_c('p',[_v("See the sections below for details of how we assess each aspect.")]),_v(" "),_c('div',{attrs:{"id":"criteria-productDesign"}},[_c('h4',{attrs:{"id":"1-project-grading-product-design-5-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("1. Project Grading: Product Design "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-project-grading-product-design-5-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")])]),_v(" "),_c('ul',[_c('li',[_v("how well your features "),_c('em',[_v("fit together")]),_v(" to form a cohesive product"),_c('br'),_v("\n(not how many features or how big/novel/interesting/difficult the features are)")]),_v(" "),_c('li',[_v("how well it "),_c('em',[_v("matches the target user")])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluated by:")])]),_v(" "),_c('ul',[_c('li',[_v("the teaching team (based on product demo and user guide)")]),_v(" "),_c('li',[_v("peers from other teams (based on peer testing and user guide)")])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Product Design")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])])]),_v(" "),_c('p'),_v(" "),_c('p',[_v("In addition, feature flaws reported in the PE will be considered when grading this aspect.")]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1)]),_v(" "),_c('div',{attrs:{"id":"grading-implementation"}},[_c('h4',{attrs:{"id":"2-project-grading-implementation-15-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("2. Project Grading: Implementation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 15 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-project-grading-implementation-15-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2A. Code quality")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" the quality of the parts of the code you claim as written by you")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")]),_v(" manual inspection by tutors + automated-analysis by a script")]),_v(" "),_c('p',[_c('strong',[_v("Criteria:")])]),_v(" "),_c('span',{attrs:{"id":"projectGrading-codeQuality-criteria"}},[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_c('big',[_v("2B. Effort")])],1)]),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" how much value you contributed to the product")]),_v(" "),_c('p',[_c('strong',[_v("Evaluation method:")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_v("Step 1: Evaluate the effort for the entire project. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Questions used for Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating Implementation Effort")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the product implementation (excluding UG, DG, and team-based tasks) is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Baseline: If your team received a value higher than "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(" in step 1 and the team agrees that you did roughly an equal share of implementation work, you should receive full marks for effort.")])])])]),_v(" "),_c('h4',{attrs:{"id":"3-project-grading-qa-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("3. Project Grading: QA "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-project-grading-qa-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('big',[_c('strong',[_v("3A. Developer Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you tested your own feature")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")])]),_v(" "),_c('ol',[_c('li',[_v("functionality bugs in your work found by others during the "),_c('a',{attrs:{"href":"/website/admin/tp-pe.html#tp-practical-exam"}},[_v("Practical Exam (PE)")])]),_v(" "),_c('li',[_v("your test code "),_c('span',{staticClass:"dimmed"},[_v("(note "),_c('trigger',{attrs:{"trigger":"click","for":"modal:projectGradingQA-testingExpectations"}},[_v("our expectations for automated testing")]),_v(")")],1)])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:projectGradingQA-testingExpectations"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Our expectations for automated testing in the project")]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])]),_v(" "),_c('box',[_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("3B. System/Acceptance Testing:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you can system-test/acceptance-test a product")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" bugs you found in the PE. In addition to functionality bugs, you get credit for reporting documentation bugs and feature flaws.")]),_v(" "),_c('box',[_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_v(" "),_c('div',{attrs:{"id":"criteria-documentation"}},[_c('h4',{attrs:{"id":"4-project-grading-documentation-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("4. Project Grading: Documentation "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-project-grading-documentation-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('strong',[_v("Evaluates:")]),_v(" your contribution to project documents")]),_v(" "),_c('p',[_c('strong',[_v("Method:")]),_v(" Evaluated in two steps.")]),_v(" "),_c('ul',[_c('li',[_v("Step 1: Evaluate the whole UG and DG. This is evaluated by peers who tested your product, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → PE → "),_c('mark',[_v("Grading Instructions for Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Step 2: Evaluate how much of that effort can be attributed to you. This is evaluated by team members, and tutors.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the UG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the User Guide is,")])],1),_v(" "),_c('span',{attrs:{"id":"equalShareScale"}},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Peer Evaluations → "),_c('mark',[_v("Questions used for Evaluating the Contribution to the DG")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("The team members' contribution to the Developer Guide is,")])],1),_v(" "),_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Uses the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal Share +/- N%")]),_v(" scale for the answer")])]},proxy:true}])},[_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"070b7"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., if the team has 4 members, this person did 1/4 of the work")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% more than an equal share (equal share x 1.10)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share + 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% more than an equal share (equal share x 1.20)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" ...")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 10%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 10% less than an equal share (equal share x 0.90)")])])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"070b7","type":"radio"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Equal share - 20%")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., this person did about 20% less than an equal share (equal share x 0.80)")])])])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("In addition, UG and DG bugs you received in the PE will be considered for grading this component.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('box',[_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1)])]),_v(" "),_c('h4',{attrs:{"id":"5-project-grading-project-management-5-5-10-marks"}},[_c('div',{staticClass:"bg-warning text-dark p-1"},[_v("5. Project Grading: Project Management "),_c('span',{staticClass:"dimmed"},[_v("["),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" 5 + "),_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" 5 = 10 marks]")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-project-grading-project-management-5-5-10-marks","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"project-management-grading"}},[_c('p',[_c('big',[_c('strong',[_v("5A. Process:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How well you did in project management related aspects of the project, as an individual and as a team")]),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" tutor/grading-script observations of project milestones and GitHub data")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Project done iteratively and incrementally "),_c('span',{staticClass:"dimmed"},[_v("(opposite: doing most of the work in one big burst)")])])]),_v(" "),_c('li',[_c('p',[_v("Project tasks done on time (to get a good grade for this aspect, finish at least 75% of the tasks by the deadline).")])]),_v(" "),_c('li',[_c('p',[_v("Good use of these GitHub mechanisms:")]),_v(" "),_c('ul',[_c('li',[_v("milestones")]),_v(" "),_c('li',[_v("releases")]),_v(" "),_c('li',[_v("issue tracker (with good task definition, assignment, and tracking)")]),_v(" "),_c('li',[_v("PRs, and PR reviews")])])]),_v(" "),_c('li',[_c('p',[_v("Good version control, based on the repo.")])]),_v(" "),_c('li',[_c('p',[_v("Reasonable attempt to use the prescribed workflows.")])]),_v(" "),_c('li',[_c('p',[_v("Good use of buffers "),_c('span',{staticClass:"dimmed"},[_v("(opposite: everything at the last minute)")]),_v(".")])])]),_v(" "),_c('p',[_c('big',[_c('strong',[_v("5B. Team-tasks:")])])],1),_v(" "),_c('p',[_c('strong',[_v("Evaluates:")]),_v(" How much you contributed to team-tasks")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Expectations: Examples of team-tasks "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Based on:")]),_v(" peer evaluations, tutor observations")]),_v(" "),_c('p',[_c('strong',[_v("Grading criteria:")]),_v(" Do the following to get a good grade for this aspect:")]),_v(" "),_c('ul',[_c('li',[_v("Do close to an equal share of the team tasks.")]),_v(" "),_c('li',[_v("Have commits in four of weeks 7, 8, 9, 10, 11, 12")])])])])])],1)],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-alpha-test-the-product"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(8),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-alpha-test-the-product","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(9),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding",attrs:{"type":"","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam (Extract) → "),_c('strong',[_v("Steps for testing a tP JAR file")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])])])],1),_c('p'),_v(" "),_c('ol',{attrs:{"start":"4"}},[_c('li',[_c('strong',[_v("Report bugs")]),_v(" you found, and "),_c('mark',[_v("even suggestions for improvements")]),_v(".\n"),_c('ul',[_c('li',[_v("If in doubt, report anyway.")]),_v(" "),_m(10),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" For this individual tP tasks to be marked as done, you need to submit at least 5 issues labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("alpha-bug")]),_v(".")])])])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("If you want to smoke-test your JAR file on an OS not available within your team, you can post a request in the forum to see if anyone else in the class can help you smoke-test it on that OS.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("The panel below contains guidelines your peers will use when determining bugs in the final product -- knowing them might be useful in preventing such bugs in your product in the first place. You may skip the 'General' section.")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Practical Exam → "),_c('strong',[_v("Guidelines for determining bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_c('p')]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Some testing tips to get you started (not an exhaustive list)...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("If your app references date/time of the computer it is running on (e.g., to calculate time elapsed), test if it can work if the computer date/time is configured to be in different formats -- different computers might use different date formats.")]),_v(" "),_c('li',[_v("Test against all typical user mistakes "),_c('span',{staticClass:"dimmed"},[_v("e.g., typing two spaces instead of one")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-fix-alpha-test-bugs-fine-tune-features"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(11),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-fix-alpha-test-bugs-fine-tune-features","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(12),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("v1.6 (extract) → More details on the feature freeze")])])]},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)]),_v(" "),_c('p')],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Ways to level up your tP game:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Consider increasing test coverage")]),_v(" by adding more tests if it is lower than the level you would like it to be. Take note of our expectation on test code (given in the panel below).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Expectation on testing")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-info"},[_v("Expectation")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('strong',[_v("Write "),_c('em',[_v("some")]),_v(" automated tests")])]),_v(" so that there is evidence that you "),_c('em',[_v("can")]),_v(" write automated tests.")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',[_c('p',[_c('strong',[_v("🤔 How much testing is enough?")]),_v(" We expect you to decide. As you learn different types of testing and what they try to achieve, you should decide how much of each type is worth having. Similarly, you can decide to what extent you want to automate tests, depending on the benefits and the effort required."),_c('br'),_v("\nThere is no requirement for a minimum test coverage level. Note that in a high-end production environment you might be required to have high levels of test coverage (e.g., 90%). In this project, it can be less. "),_c('mark',[_v("Caveat: The weaker your tests are, the higher the risk of undetected bugs/regressions, which will cost you marks if not detected/fixed before the final submission.")])])])],1)])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("After you have sufficient code coverage, fix remaining code quality problems")]),_v(" and bring up the quality to your target level. Note that the quality of the code attributed to you accounts for a significant component of your final score, graded individually (based on the code attributed to you by the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP code dashboard")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Grading → "),_c('strong',[_v("Code Quality Tips")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("At least some evidence of these (see "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/errorHandling.html"}},[_v("here")]),_v(" for more info)")]),_v(" "),_c('ul',[_c('li',[_v("logging")]),_v(" "),_c('li',[_v("exceptions")]),_v(" "),_c('li',[_v("assertions")]),_v(" "),_c('li',[_v("defensive coding")])])]),_v(" "),_c('li',[_c('p',[_v("No "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html"}},[_v("coding standard")]),_v(" violations "),_c('span',{staticClass:"dimmed"},[_v("e.g. all boolean variables/methods sounds like booleans")]),_v(". Checkstyle can prevent only "),_c('em',[_v("some")]),_v(" coding standard violations; others need to be checked manually.")])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/codeQuality.html#slap-hard"}},[_v("SLAP")]),_v(" is applied at a reasonable level. Long methods or deeply-nested code are symptoms of low-SLAP.")])]),_v(" "),_c('li',[_c('p',[_v("No noticeable code duplications "),_c('span',{staticClass:"dimmed"},[_v("i.e. if there multiple blocks of code that vary only in minor ways, try to extract out similarities into one place")]),_v(", especially in test code.")])]),_v(" "),_c('li',[_c('p',[_v("Evidence of applying "),_c('a',{attrs:{"href":"/website/book/codeQuality"}},[_v("code quality guidelines covered in the course")]),_v(".")])])])])])],1),_c('p')])],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Must we fix all bugs reported and all enhancements suggested by testers?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not necessarily. Choose based on importance.")]),_v(" "),_c('p',[_v("In any project, there are always things that can be done 'if there was more time'. If fixing a certain bug has low impact on users, and fixing it is not as important as the work done (or intend to do in the current iteration), you can justify not fixing it with the reason 'not in scope' of the current iteration.")]),_v(" "),_c('p',[_v("Similarly, a missing feature enhancement can be justified as 'not in scope' if implementing that could have taken resources away from other important project tasks.")]),_v(" "),_c('p',[_v("Bugs and possible enhancements 'not in scope' will not be penalized.")])])])],1),_v(" "),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-update-ug-and-dg"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(13),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-update-ug-and-dg","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Update the User Guide")]),_v(" to match the current version of the product. "),_c('span',{staticClass:"dimmed"},[_v("Reason: testers will need to refer to the UG during the practical exam dry run")]),_v(".\n"),_m(14)])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("User Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(15),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("Caution on PDF conversions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-PDF-Friendly")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-pdf-friendly"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-PDF-Friendly")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-pdf-friendly","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The DG and UG should be PDF-friendly. Don't use expandable panels, embedded videos, animated GIFs etc. "),_c('br')]),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" The UG and DG used in the final grading will be in PDF format")])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → "),_c('strong',[_v("Constraint-File-Size")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p'),_v(" "),_m(16),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("Developer Guide")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_m(17),_v(": Update to look like a real product (rather than a project for learning SE) if you haven't done so already. In particular, "),_c('mark',[_v("update the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" to match the current product ("),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-tipsForProductScreenshot"}},[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" tips")]),_v(")")],1),_v(".")])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-tipsForProductScreenshot"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin → Project Deliverables → Website -> Tips for Product Screenshots")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-release-v1-5-thu-nov-7th-23-59"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(18),_v(" "),_m(19),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-release-v1-5-thu-nov-7th-23-59","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Do a "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("resulting in a jar file on GitHub that can be downloaded by potential users")]},proxy:true}])},[_v("proper product release")])],1),_v(" "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp/DevOps.html#making-a-release"}},[_v("as described in the Developer Guide")]),_v(". Do the release by the given deadline. "),_c('br'),_v(" "),_c('mark',[_v("Do a smoke-test to ensure the jar file works")]),_v(" (if the released jar file is broken, it will be omitted from the PE-D)."),_c('br'),_v(" "),_m(20)]),_v(" "),_m(21),_v(" "),_c('li',[_c('strong',[_v("The "),_c('trigger',{attrs:{"trigger":"click","for":"modal:v13-jar-desc"}},[_c('em',[_v("feature freeze")])]),_v(" will apply at the point you released the JAR file that was used in the PE-D")],1),_v(" i.e., the features submitted in the final "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.6")]),_v(" later should be the same as the features tested during PE-D, which is the rationale for the feature freeze anyway.")]),_v(" "),_m(22)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:v13-jar-desc"},scopedSlots:_u([{key:"header",fn:function(){return undefined},proxy:true}])},[_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1)])],1),_v(" "),_c('p'),_v(" "),_c('div')])])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#week-11-mon-oct-28th-project"}},[_v("Week 11 [Mon, Oct 28th] - Project‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-release-candidate-v1-5"}},[_v(" tP: Release candidate → v1.5 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-11"}},[_v("Intro to tP Week 11‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-alpha-test-the-product"}},[_v("1 Alpha-test the product‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-fix-alpha-test-bugs-fine-tune-features"}},[_v("2 Fix alpha-test bugs, fine-tune features‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-update-ug-and-dg"}},[_v("3 Update UG and DG‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-release-v1-5-thu-nov-7th-23-59"}},[_v("4 Release v1.5 Thu, Nov 7th 23:59‎")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(23)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -74,6 +74,6 @@ with(this){return _c('li',[_c('strong',[_v("You can do an "),_c('em',[_v("additi with(this){return _c('li',[_v("As before, wrap up the milestone "),_c('span',{staticClass:"dimmed"},[_v("(i.e., reschedule/close any remaining issues/PRs and close the milestone).")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week11/topics.html b/schedule/week11/topics.html index 614c37ab59..57c8758b23 100644 --- a/schedule/week11/topics.html +++ b/schedule/week11/topics.html @@ -207,7 +207,7 @@ -

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.


    Exercises:

    Polymorphism and the Observer pattern


    Observer pattern usage



    Guidance for the item(s) below:

    Given below are a few more topics that continue the theme of design patterns, but have been made optional to reduce the course workload.

    W11.1c : OPTIONAL

    Design → Design Patterns → Other design patterns


    W11.1d : OPTIONAL

    Design → Design Patterns → Combining design patterns


    W11.1e : OPTIONAL

    Design → Design Patterns → Using design patterns


    W11.1f : OPTIONAL

    Design → Design Patterns → Design patterns versus design principles


    W11.1g : OPTIONAL

    Design → Design Patterns → Other types of patterns



    Guidance for the item(s) below:

    The next topic is like 'design patterns at architecture level'. In fact, the MVC pattern you saw earlier comes close to this category too.

    [W11.2] Architectural Styles

    Video

    W11.2a

    Design → Architecture → Styles → What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...


    W11.2b

    Design → Architecture → Styles → n-Tier Style → What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.


    W11.2c

    Design → Architecture → Styles → Client-Server Style → What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.


    W11.2d

    Design → Architecture → Styles → Event-Driven Style → What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.


    W11.2e

    Design → Architecture → Styles → Transaction Processing Style → What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.


    W11.2f

    Design → Architecture → Styles → Service-Oriented Style → What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:

    W11.2g

    Design → Architecture → Styles → Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.



    W11.2h : OPTIONAL

    Design → Architecture → Styles → More styles



    Follow up notes for the item(s) above:

    As with design patterns, we covered only a few architecture styles. Although you didn't have to design an architecture in the tP, knowing the existence of these styles might come in handy in your future projects.

    Guidance for the item(s) below:

    Earlier, you learned that can improve the test case quality. Even when applying them, the number of test cases can increase when the SUT takes multiple inputs. Let's see how we can deal with such situations.

    [W11.3] Test Cases: Combining Multiple Inputs

    Video Q+

    W11.3a

    Quality Assurance → Test Case Design → Combining Test Inputs → Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    W11.3b

    Quality Assurance → Test Case Design → Combining Test Inputs → Test input combination strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    W11.3c

    Quality Assurance → Test Case Design → Combining Test Inputs → Heuristic: Each valid input at least once in a positive test case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    W11.3d

    Quality Assurance → Test Case Design → Combining Test Inputs → Heuristic: Test invalid inputs individually before combining them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    W11.3e

    Quality Assurance → Test Case Design → Combining Test Inputs → Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method




    Guidance for the item(s) below:

    Testing is the first thing that comes to mind when you hear 'Quality Assurance' but there are other QA techniques that can complement testing. Let's first take a step back and take a look at QA in general, followed by a look at some other QA techniques.

    [W11.4] Other QA Techniques

    W11.4a

    Quality Assurance → Quality Assurance → Introduction → What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    W11.4b

    Quality Assurance → Quality Assurance → Introduction → Validation versus verification

    Video

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification



    Guidance for the item(s) below:

    Previously, you already learned about two 'other' QA methods. This week, we add a third:

    • Code reviews
    • Static Analysis
    • Formal methods
    W11.4c

    Quality Assurance → Quality Assurance → Formal Verification → What

    Video

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors




    Guidance for the item(s) below:

    Do you know the difference between a library and a framework?

    Programmers often reuse code in various ways. The next few topics aim to clarify the difference between several forms reusable software comes in.

    [W11.5] Reuse

    Video


    Intro

    W11.5a

    Implementation → Reuse → Introduction → What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    W11.5b

    Implementation → Reuse → Introduction → When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework




    APIs

    W11.5c

    Implementation → Reuse → APIs → What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    W11.5d : OPTIONAL

    Implementation → Reuse → APIs → Designing APIs



    Libraries

    W11.5e

    Implementation → Reuse → Libraries → What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    W11.5f

    Implementation → Reuse → Libraries → How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.


    Frameworks

    W11.5g

    Implementation → Reuse → Frameworks → What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    W11.5h

    Implementation → Reuse → Frameworks → Frameworks versus libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?




    Platforms

    W11.5i

    Implementation → Reuse → Platforms → What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.


    Guidance for the item(s) below:

    While not examinable, the next few sections explain some basic cloud computing concepts that are relevant to software engineers.

    [W11.6] Cloud Computing : OPTIONAL

    W11.6a : OPTIONAL

    Implementation → Reuse → Cloud Computing → What


    W11.6b : OPTIONAL

    Implementation → Reuse → Cloud Computing → Iaas, PaaS, and SaaS



    Guidance for the item(s) below:

    To complete the picture about UML, given below are a peek into the other types of UML diagrams.

    [W11.7] Other UML Models : OPTIONAL

    W11.7a : OPTIONAL

    Design → Modelling → Modelling Behaviors → Communication diagrams


    W11.7b : OPTIONAL

    Design → Modelling → Modelling Behaviors → State machine diagrams


    W11.7c : OPTIONAL

    Design → Modelling → Modelling Structure → Deployment diagrams


    W11.7d : OPTIONAL

    Design → Modelling → Modelling Structure → Component diagrams


    W11.7e : OPTIONAL

    Design → Modelling → Modelling Structure → Package diagrams


    W11.7f : OPTIONAL

    Design → Modelling → Modelling Structure → Composite structure diagrams


    W11.7g : OPTIONAL

    Design → Modelling → Modelling Behaviors → Timing diagrams


    W11.7h : OPTIONAL

    Design → Modelling → Modelling Behaviors → Interaction overview diagrams



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.


    Exercises:

    Polymorphism and the Observer pattern


    Observer pattern usage



    Guidance for the item(s) below:

    Given below are a few more topics that continue the theme of design patterns, but have been made optional to reduce the course workload.

    W11.1c : OPTIONAL

    Design → Design Patterns → Other design patterns


    W11.1d : OPTIONAL

    Design → Design Patterns → Combining design patterns


    W11.1e : OPTIONAL

    Design → Design Patterns → Using design patterns


    W11.1f : OPTIONAL

    Design → Design Patterns → Design patterns versus design principles


    W11.1g : OPTIONAL

    Design → Design Patterns → Other types of patterns



    Guidance for the item(s) below:

    The next topic is like 'design patterns at architecture level'. In fact, the MVC pattern you saw earlier comes close to this category too.

    [W11.2] Architectural Styles

    Video

    W11.2a

    Design → Architecture → Styles → What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...


    W11.2b

    Design → Architecture → Styles → n-Tier Style → What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.


    W11.2c

    Design → Architecture → Styles → Client-Server Style → What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.


    W11.2d

    Design → Architecture → Styles → Event-Driven Style → What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.


    W11.2e

    Design → Architecture → Styles → Transaction Processing Style → What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.


    W11.2f

    Design → Architecture → Styles → Service-Oriented Style → What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:

    W11.2g

    Design → Architecture → Styles → Using styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.



    W11.2h : OPTIONAL

    Design → Architecture → Styles → More styles



    Follow up notes for the item(s) above:

    As with design patterns, we covered only a few architecture styles. Although you didn't have to design an architecture in the tP, knowing the existence of these styles might come in handy in your future projects.

    Guidance for the item(s) below:

    Earlier, you learned that can improve the test case quality. Even when applying them, the number of test cases can increase when the SUT takes multiple inputs. Let's see how we can deal with such situations.

    [W11.3] Test Cases: Combining Multiple Inputs

    Video Q+

    W11.3a

    Quality Assurance → Test Case Design → Combining Test Inputs → Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    W11.3b

    Quality Assurance → Test Case Design → Combining Test Inputs → Test input combination strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    W11.3c

    Quality Assurance → Test Case Design → Combining Test Inputs → Heuristic: Each valid input at least once in a positive test case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    W11.3d

    Quality Assurance → Test Case Design → Combining Test Inputs → Heuristic: Test invalid inputs individually before combining them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    W11.3e

    Quality Assurance → Test Case Design → Combining Test Inputs → Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method




    Guidance for the item(s) below:

    Testing is the first thing that comes to mind when you hear 'Quality Assurance' but there are other QA techniques that can complement testing. Let's first take a step back and take a look at QA in general, followed by a look at some other QA techniques.

    [W11.4] Other QA Techniques

    W11.4a

    Quality Assurance → Quality Assurance → Introduction → What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    W11.4b

    Quality Assurance → Quality Assurance → Introduction → Validation versus verification

    Video

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification



    Guidance for the item(s) below:

    Previously, you already learned about two 'other' QA methods. This week, we add a third:

    • Code reviews
    • Static Analysis
    • Formal methods
    W11.4c

    Quality Assurance → Quality Assurance → Formal Verification → What

    Video

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors




    Guidance for the item(s) below:

    Do you know the difference between a library and a framework?

    Programmers often reuse code in various ways. The next few topics aim to clarify the difference between several forms reusable software comes in.

    [W11.5] Reuse

    Video


    Intro

    W11.5a

    Implementation → Reuse → Introduction → What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    W11.5b

    Implementation → Reuse → Introduction → When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework




    APIs

    W11.5c

    Implementation → Reuse → APIs → What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    W11.5d : OPTIONAL

    Implementation → Reuse → APIs → Designing APIs



    Libraries

    W11.5e

    Implementation → Reuse → Libraries → What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    W11.5f

    Implementation → Reuse → Libraries → How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.


    Frameworks

    W11.5g

    Implementation → Reuse → Frameworks → What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    W11.5h

    Implementation → Reuse → Frameworks → Frameworks versus libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?




    Platforms

    W11.5i

    Implementation → Reuse → Platforms → What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.


    Guidance for the item(s) below:

    While not examinable, the next few sections explain some basic cloud computing concepts that are relevant to software engineers.

    [W11.6] Cloud Computing : OPTIONAL

    W11.6a : OPTIONAL

    Implementation → Reuse → Cloud Computing → What


    W11.6b : OPTIONAL

    Implementation → Reuse → Cloud Computing → Iaas, PaaS, and SaaS



    Guidance for the item(s) below:

    To complete the picture about UML, given below are a peek into the other types of UML diagrams.

    [W11.7] Other UML Models : OPTIONAL

    W11.7a : OPTIONAL

    Design → Modelling → Modelling Behaviors → Communication diagrams


    W11.7b : OPTIONAL

    Design → Modelling → Modelling Behaviors → State machine diagrams


    W11.7c : OPTIONAL

    Design → Modelling → Modelling Structure → Deployment diagrams


    W11.7d : OPTIONAL

    Design → Modelling → Modelling Structure → Component diagrams


    W11.7e : OPTIONAL

    Design → Modelling → Modelling Structure → Package diagrams


    W11.7f : OPTIONAL

    Design → Modelling → Modelling Structure → Composite structure diagrams


    W11.7g : OPTIONAL

    Design → Modelling → Modelling Behaviors → Timing diagrams


    W11.7h : OPTIONAL

    Design → Modelling → Modelling Behaviors → Interaction overview diagrams



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week11/topics.page-vue-render.js b/schedule/week11/topics.page-vue-render.js index 74684a62d7..21f214ebbf 100644 --- a/schedule/week11/topics.page-vue-render.js +++ b/schedule/week11/topics.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week11/tutorial.html b/schedule/week11/tutorial.html index 51ce14e59a..bae339db23 100644 --- a/schedule/week11/tutorial.html +++ b/schedule/week11/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 11 [Mon, Oct 28th] - Tutorial

    Week 11 Tutorial Video

    Graded activity: The in-video quiz in this video will be used to assess participation for this tutorial.

    Deadline to watch this tutorial (and answer the in-video quiz): Mon, Nov 4th 23:59

    Before watching the video:

    1. If you did not attend the last weekly briefing (in which we did the CATcher load testing), watch the first 15 minutes of the briefing recording, as the question discussed during that time is highly related to this tutorial.
    2. As usual, learn this week's topics (and ideally, submit the Canvas quiz), so that you have the necessary knowledge for this tutorial.
    VideoWeek 11 Tutorial (30 minutes)

    1 Exercise: Equivalence partitions, boundary values

    • Do the following exercise as directed by the tutor.

    Design test cases for the day parameter



    2 Exercise: Combining multiple test inputs

    • Do the following exercise similar to the previous one.

    Combine test inputs for the consume method



    3 Exercise: Apply design patterns

    • Do the following exercise similar to the previous one.

    Apply the suitable pattern



    4 Exercise: Patterns in the tP

    1. Does AB3 use the MVC pattern?
    2. Does AB3 use the Observer pattern?
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 11 [Mon, Oct 28th] - Tutorial

    Week 11 Tutorial Video

    Graded activity: The in-video quiz in this video will be used to assess participation for this tutorial.

    Deadline to watch this tutorial (and answer the in-video quiz): Mon, Nov 4th 23:59

    Before watching the video:

    1. If you did not attend the last weekly briefing (in which we did the CATcher load testing), watch the first 15 minutes of the briefing recording, as the question discussed during that time is highly related to this tutorial.
    2. As usual, learn this week's topics (and ideally, submit the Canvas quiz), so that you have the necessary knowledge for this tutorial.
    VideoWeek 11 Tutorial (30 minutes)

    1 Exercise: Equivalence partitions, boundary values

    • Do the following exercise as directed by the tutor.

    Design test cases for the day parameter



    2 Exercise: Combining multiple test inputs

    • Do the following exercise similar to the previous one.

    Combine test inputs for the consume method



    3 Exercise: Apply design patterns

    • Do the following exercise similar to the previous one.

    Apply the suitable pattern



    4 Exercise: Patterns in the tP

    1. Does AB3 use the MVC pattern?
    2. Does AB3 use the Observer pattern?
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week11/tutorial.page-vue-render.js b/schedule/week11/tutorial.page-vue-render.js index 7370de8bd6..b339fd0fbb 100644 --- a/schedule/week11/tutorial.page-vue-render.js +++ b/schedule/week11/tutorial.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('ul',[_c('li',[_v("Do the following exercise similar to the with(this){return _c('ol',[_c('li',[_v("Does AB3 use the "),_c('em',[_v("MVC")]),_v(" pattern?")]),_v(" "),_c('li',[_v("Does AB3 use the "),_c('em',[_v("Observer")]),_v(" pattern?")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week12/admin.html b/schedule/week12/admin.html index fdb91828e7..63eb39d839 100644 --- a/schedule/week12/admin.html +++ b/schedule/week12/admin.html @@ -193,7 +193,7 @@ They will be disappointed if only a few students cared enough to give feedback.
  • Please don't rate the 'other' tutor appearing in the submission form but didn't tutor you. That is another tutor teaching in the same time slot as yours.
    In particular, don't give a Neutral ratings to that 'unknown' tutor as it can affect their -performance evaluation.
  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +performance evaluation.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week12/admin.page-vue-render.js b/schedule/week12/admin.page-vue-render.js index 8b21a69adc..7d82d6f123 100644 --- a/schedule/week12/admin.page-vue-render.js +++ b/schedule/week12/admin.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('ul',[_c('li',[_v("Submit the Canvas survey to declare whic with(this){return _c('div',[_c('ul',[_c('li',[_v("[Not urgent] "),_c('strong',[_v("A gentle reminder to submit feedback for your tutor")]),_v(" via the semester-end\nstudent feedback exercise, if you can spare a few minutes."),_c('br'),_v("\nThey will be disappointed if only a few students cared enough to give feedback."),_c('br')]),_v(" "),_c('li',[_c('strong',[_v("Please "),_c('mark',[_v("don't rate the 'other' tutor")])]),_v(" appearing in the submission form but didn't tutor you.\nThat is another tutor teaching in the same time slot as yours."),_c('br'),_v("\nIn particular, don't give a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Neutral")]),_v(" ratings to that 'unknown' tutor as it can affect their\nperformance evaluation.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week12/index.html b/schedule/week12/index.html index 2246f30ab1..833339ea8c 100644 --- a/schedule/week12/index.html +++ b/schedule/week12/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 12 [Mon, Nov 4th] - Summary

    Next week's briefing (and the PE Dry Run)

    Heads up! Attendance is compulsory for the weekly briefing coming up on Fri, Nov 8th , as we use that time slot for the Practical Exam Dry Run (graded).

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 12 [Mon, Nov 4th] - Summary

    Next week's briefing (and the PE Dry Run)

    Heads up! Attendance is compulsory for the weekly briefing coming up on Fri, Nov 8th , as we use that time slot for the Practical Exam Dry Run (graded).

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit the declaration about code reuse COMPULSORY | Tue, Nov 12th 2359
    2. Submit the PE mode selection COMPULSORY | Sat, Nov 9th 2359
    3. Submit feedback for tutors

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week12/index.page-vue-render.js b/schedule/week12/index.page-vue-render.js index de02c8e0b3..5bd1a7d7d3 100644 --- a/schedule/week12/index.page-vue-render.js +++ b/schedule/week12/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",att with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Nov 8th 1600-1800")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week12/project.html b/schedule/week12/project.html index 9618d152b7..92c1592640 100644 --- a/schedule/week12/project.html +++ b/schedule/week12/project.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 12 [Mon, Nov 4th] - Project

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    tP: Extra week for v1.5

    Intro to tP Week 12

    What's happening this week:

    We are still in iteration v1.5, due to this iteration being stretched over two weeks.

    1 Finish any remaining v1.5 tasks

    • Use this extra week to finish any leftover tasks from the previous week.

    2 Attend the practical exam dry run Fri, Nov 8th 1600-1800

    • The practical exam dry run (PE-D) will be held in the coming weekly briefing. It is graded. See the panel below for more info.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 12 [Mon, Nov 4th] - Project

    tP:

    1. Finish any remaining v1.5 tasks
    2. Attend the practical exam dry run Fri, Nov 8th 1600-1800

    tP: Extra week for v1.5

    Intro to tP Week 12

    What's happening this week:

    We are still in iteration v1.5, due to this iteration being stretched over two weeks.

    1 Finish any remaining v1.5 tasks

    • Use this extra week to finish any leftover tasks from the previous week.

    2 Attend the practical exam dry run Fri, Nov 8th 1600-1800

    • The practical exam dry run (PE-D) will be held in the coming weekly briefing. It is graded. See the panel below for more info.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week12/project.page-vue-render.js b/schedule/week12/project.page-vue-render.js index 6115d52510..c686303503 100644 --- a/schedule/week12/project.page-vue-render.js +++ b/schedule/week12/project.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('ul',[_c('li',[_v("The practical exam dry run (PE-D) will be held in the coming weekly briefing. It is "),_c('mark',[_v("graded")]),_v(". See the panel below for more info.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week12/topics.html b/schedule/week12/topics.html index ae4916030f..7e8fd0409d 100644 --- a/schedule/week12/topics.html +++ b/schedule/week12/topics.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week12/topics.page-vue-render.js b/schedule/week12/topics.page-vue-render.js index f325717716..240df24a10 100644 --- a/schedule/week12/topics.page-vue-render.js +++ b/schedule/week12/topics.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('p',[_c('strong',[_v("No more topics left!")]),_c('br')])} with(this){return _c('small',[_c('span',{staticClass:"dimmed"},[_v("[image source: esmemes.com]")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week12/tutorial.html b/schedule/week12/tutorial.html index ca5c0069e6..a3464a785c 100644 --- a/schedule/week12/tutorial.html +++ b/schedule/week12/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week12/tutorial.page-vue-render.js b/schedule/week12/tutorial.page-vue-render.js index 0f76f0dbb0..48280d9355 100644 --- a/schedule/week12/tutorial.page-vue-render.js +++ b/schedule/week12/tutorial.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('nav',[_c('ul',{staticClass:"pagination mt-2"},[_c('li',{st with(this){return _c('h1',{attrs:{"id":"week-12-mon-nov-4th-tutorial"}},[_v("Week 12 "),_c('small',[_c('small',[_c('span',{staticClass:"dimmed"},[_v("[Mon, Nov 4th]")]),_v(" - Tutorial")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#week-12-mon-nov-4th-tutorial","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week13/admin.html b/schedule/week13/admin.html index 7bc9ca06ec..16309393d4 100644 --- a/schedule/week13/admin.html +++ b/schedule/week13/admin.html @@ -14,7 +14,7 @@

    Week 13 [Mon, Nov 11th] - Admin

    1. Submit final peer evaluation on TEAMMATES Thu, Nov 14th 2359
    2. Submit the PE-Readiness Quiz before the PE

    1 Submit final peer evaluation on TEAMMATES Thu, Nov 14th 2359

    • Submission will open within one day after the tP final submission (i.e., sometime in Wed, Nov 13th).
      If you did not receive the submission link, you can get TEAMMATES to resend the link by going to TEAMMATES link recovery page and entering your NUSNET email address (try the e______@u.nus.edu before trying the 'friendly' email address). Remember to check your spam folder as well.

    Admin Peer Evaluations → Session: Final Peer Evaluation

    Session: Final Peer Evaluation

    • Held at the end of the tP.
    • This peer evaluation is compulsory. Not only it will count for weekly participation, those who don't submit will not get a chance to rebut peer evaluations received.
    • This session includes all questions from the Midterm Peer Evaluation:

    • In addition, it contains these additional questions:

    Q Do you agree with the contributions claimed by team members, as stated in their PPP?
    -You may omit this question for members who have not submitted the PPP.

    Q Rank team members based on their ability/potential to lead a software project team (rank 1 is strongest)


    2 Submit the PE-Readiness Quiz before the PE

    • Submit this quiz (on Canvas) to confirm that you know important details about the PE.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +You may omit this question for members who have not submitted the PPP.

    Q Rank team members based on their ability/potential to lead a software project team (rank 1 is strongest)


    2 Submit the PE-Readiness Quiz before the PE

    • Submit this quiz (on Canvas) to confirm that you know important details about the PE.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week13/admin.page-vue-render.js b/schedule/week13/admin.page-vue-render.js index ec090f379d..243b6d911c 100644 --- a/schedule/week13/admin.page-vue-render.js +++ b/schedule/week13/admin.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('div',[_c('ul',[_c('li',[_v("Submit this quiz (on Canvas) to confirm that you know important details about the PE.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week13/index.html b/schedule/week13/index.html index 95a4dc1e53..ac15b3fbf0 100644 --- a/schedule/week13/index.html +++ b/schedule/week13/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 13 [Mon, Nov 11th] - Summary

    Course Briefing Videos

    There is no weekly briefing this week. Instead, we have the following two course briefing videos. Viewing is highly recommended, as both can help you with your exam preparations.

    Final Exam: This video contains an overview of the final exam structure and resources that you can use to prepare for it.

    Video Video will be released closer to week 13 ...

    Course Topics Recap aka the 'Big Picture': This video explains how course topics fit into a big picture, and as a bonus, touches on some exam-like questions as well.

    Video Video will be released closer to week 13 ...


    Please note that tutors will not be available for consultations after this week (doesn't apply to this week). As most tutors are UG students who have their own exams, we do not allow CS2103/T students to take up tutors' time during the reading week and the exam period. This is especially important for CS2103/T tutors as they have to spend a significant time on adjudicating disputed PE bugs.

    Any questions related to the course should be posted in the forum (preferred) or sent to the course email cs2103@comp.nus.edu.sg.

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit final peer evaluation on TEAMMATES Thu, Nov 14th 2359
    2. Submit the PE-Readiness Quiz before the PE

    tP: v1.6

    1. Fix PE-D bugs
    2. Submit final deliverables Tue, Nov 12th 14:00
    3. Prepare for the practical exam
    4. Ensure the code is RepoSense-compatible
    5. Attend the practical exam Fri, Nov 15th 1600-1800
    6. [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 13 [Mon, Nov 11th] - Summary

    Course Briefing Videos

    There is no weekly briefing this week. Instead, we have the following two course briefing videos. Viewing is highly recommended, as both can help you with your exam preparations.

    Final Exam: This video contains an overview of the final exam structure and resources that you can use to prepare for it.

    Video Video will be released closer to week 13 ...

    Course Topics Recap aka the 'Big Picture': This video explains how course topics fit into a big picture, and as a bonus, touches on some exam-like questions as well.

    Video Video will be released closer to week 13 ...


    Please note that tutors will not be available for consultations after this week (doesn't apply to this week). As most tutors are UG students who have their own exams, we do not allow CS2103/T students to take up tutors' time during the reading week and the exam period. This is especially important for CS2103/T tutors as they have to spend a significant time on adjudicating disputed PE bugs.

    Any questions related to the course should be posted in the forum (preferred) or sent to the course email cs2103@comp.nus.edu.sg.

    Topics:

    • No topics allocated to this week.

    Admin:

    1. Submit final peer evaluation on TEAMMATES Thu, Nov 14th 2359
    2. Submit the PE-Readiness Quiz before the PE

    tP: v1.6

    1. Fix PE-D bugs
    2. Submit final deliverables Tue, Nov 12th 14:00
    3. Prepare for the practical exam
    4. Ensure the code is RepoSense-compatible
    5. Attend the practical exam Fri, Nov 15th 1600-1800
    6. [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week13/index.page-vue-render.js b/schedule/week13/index.page-vue-render.js index 3e4ea7df5f..fc8d3c84b3 100644 --- a/schedule/week13/index.page-vue-render.js +++ b/schedule/week13/index.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"}, with(this){return _c('div',[_c('p',[_c('strong',[_v("tP:")]),_v(" "),_c('span',{staticClass:"border rounded text-success border-success pe-1 ps-1"},[_c('span',{staticClass:"fas fa-tag",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("v1.6")])])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Fix PE-D bugs")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Submit final deliverables")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Tue, Nov 12th 14:00")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Prepare for the practical exam")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Ensure the code is RepoSense-compatible")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Attend the practical exam")]),_v(" "),_c('span',{staticClass:"badge bg-warning text-dark font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Nov 15th 1600-1800")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("[if needed] Attend the makeup practical exam")])]),_v(" "),_c('span',{staticClass:"badge bg-secondary font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Sun, Nov 17th 1400-1600")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week13/project.html b/schedule/week13/project.html index cda36f32cb..5404510fbd 100644 --- a/schedule/week13/project.html +++ b/schedule/week13/project.html @@ -13,7 +13,7 @@

    Week 13 [Mon, Nov 11th] - Project

    tP: v1.6

    1. Fix PE-D bugs
    2. Submit final deliverables Tue, Nov 12th 14:00
    3. Prepare for the practical exam
    4. Ensure the code is RepoSense-compatible
    5. Attend the practical exam Fri, Nov 15th 1600-1800
    6. [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    tP: Public release → v1.6

    Intro to tP Week 13

    What's happening this week:

    v1.6

    • Learning outcome: Able to put in final touches while minimizing delivery risks i.e., risks of regressions or deadline overruns.
    • Product goal: Reach the quality necessary for a public release.
    • Strategy: Freeze features. Strictly limit changes to bug fixes only.

    Things to note:

    Remind yourself of our policy on reuse (e.g., how to give credit for reused code):

    1 Fix PE-D bugs

    1. Triage bugs you received in the PE-D, by following the procedure given below:

    1. Note what is allowed in this milestone:

    The goal of freezing features in the pre-release iteration is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs.
    -In a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow any feature changes because it can start us on a slippery slope and many "is this change allowed?" queries. Therefore, v1.6 should not have any behaviors that were not already tested in the ). Hence, the feature freeze comes into effect at the point you released the JAR file that was used for the PE-D.

    While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and follow the spirit of the feature freeze (i.e., do not change features further; correct unintentional errors only).

    Allowed in the v1.6 milestone:

    • fixing bugs (but not feature flaws) -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.
    • improving documentation (e.g., update UG, DG, code comments)
    • improving code quality
    • improving the testing aspect (e.g., add more tests)
    • removing features (i.e., removing an entire feature or a part of a feature)

    Not allowed in v1.6:

    • adding/changing features (even minor behavior enhancements/tweaks)
    • any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)
    • updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)

    Using 'Planned Enhancements' DG section to counter known feature flaws: Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named Appendix: Planned Enhancements to the end of the DG. More details in the panel below:

    FAQs on what is allowed during the feature freeze:

    [Q0] What's the penalty for violating the feature freeze?


    [Q1] How to differentiate between bugs vs enhancements?


    [Q2] Will we be penalized for feature flaws not fixed during the feature freeze?


    [Q3] What if an issue is related to a behavior not specifically stated in the UG?


    [Q4] What if a feature is mentioned in the UG but not available fully in the product?


    [Q5] Can we tweak validity checks for a user input, or error/exception handling?


    [Q6] Can we tweak UI text (i.e., error/help messages or other text shown to the user)?


    [Q7] Can we tweak case-sensitivity of a feature?


    [Q8] A UI text gets truncated (or overflows) for certain inputs (or certain Windows sizes); can we fix them?


    [Q9] Can we tweak the command format?


    [Q10] What if the UI is inconsistent with the data?


    [Q11] The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?


    [Q12] We already merged a PR that violates the feature freeze. Now what?


    [Q13] How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?


    [Q14] What if the same bug is reported in the PE?


    1. Fix bugs that you deem as important enough to be fixed in v1.6. Also keep in mind that bug fixing can cause regressions which you'll have to catch and fix.

    2. Submit peer evaluations for PE-D testers: Submit your peer-evaluation of PE-D testers to indicate how well they helped your team.
      +In a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow any feature changes because it can start us on a slippery slope and many "is this change allowed?" queries. Therefore, v1.6 should not have any behaviors that were not already tested in the ). Hence, the feature freeze comes into effect at the point you released the JAR file that was used for the PE-D.

      While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and follow the spirit of the feature freeze (i.e., do not change features further; correct unintentional errors only).

      Allowed in the v1.6 milestone:

      • fixing bugs (but not feature flaws) -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.
      • improving documentation (e.g., update UG, DG, code comments)
      • improving code quality
      • improving the testing aspect (e.g., add more tests)
      • removing features (i.e., removing an entire feature or a part of a feature)

      Not allowed in v1.6:

      • adding/changing features (even minor behavior enhancements/tweaks)
      • any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)
      • updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)

      Using 'Planned Enhancements' DG section to counter known feature flaws: Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named Appendix: Planned Enhancements to the end of the DG. More details in the panel below:

      FAQs on what is allowed during the feature freeze:

      [Q0] What's the penalty for violating the feature freeze?


      [Q1] How to differentiate between bugs vs enhancements?


      [Q2] Will we be penalized for feature flaws not fixed during the feature freeze?


      [Q3] What if an issue is related to a behavior not specifically stated in the UG?


      [Q4] What if a feature is mentioned in the UG but not available fully in the product?


      [Q5] Can we tweak validity checks for a user input, or error/exception handling?


      [Q6] Can we tweak UI text (i.e., error/help messages or other text shown to the user)?


      [Q7] Can we tweak case-sensitivity of a feature?


      [Q8] A UI text gets truncated (or overflows) for certain inputs (or certain Windows sizes); can we fix them?


      [Q9] Can we tweak the command format?


      [Q10] What if the UI is inconsistent with the data?


      [Q11] The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?


      [Q12] We already merged a PR that violates the feature freeze. Now what?


      [Q13] How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?


      [Q14] What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?


    1. Fix bugs that you deem as important enough to be fixed in v1.6. Also keep in mind that bug fixing can cause regressions which you'll have to catch and fix.

    2. Submit peer evaluations for PE-D testers: Submit your peer-evaluation of PE-D testers to indicate how well they helped your team.
      Deadline: by Wed, Nov 13th 2359
      The submission is to be done via the TEAMMATES system.
      Only one team member needs to submit on behalf of the team but discuss among team members first.
      @@ -34,7 +34,7 @@

      • Convert to pdf and upload to Canvas.
      • File name: [TEAM_ID][ProductName]UG.pdf e.g.[CS2103-T09-2][ContactsPlus]UG.pdf

    • Developer Guide:
      • submission is similar to the UG
      • File name: [TEAM_ID][ProductName]DG.pdf e.g. [CS2103-T09-2][ContactsPlus]DG.pdf

    • [Optional] Project Portfolio Page (PPP):
      • HTML version: make available on github.io
      • See the panel below to learn when you should opt for this submission.

    Admin tP → Deliverables → Project Portfolio Page

    At the end of the project each student is required to submit a Project Portfolio Page. To reduce workload, this deliverable has been made optional this semester. You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.

    Details ... (read only if you opted to submit this deliverable)

    PPP Objectives

    • For you to use (e.g. in your resume) as a well-documented data point of your SE experience
    • For evaluators to use as a data point for evaluating your project contributions

    PPP Sections to include

    • Overview: A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.
    • Summary of Contributions --Suggested items to include: -
      • Code contributed: Give a link to your code on tP Code Dashboard. The link is available in the Project List Page -- linked to the icon under your profile picture.
      • Enhancements implemented: A summary of the enhancements you implemented.
      • Contributions to the UG: Which sections did you contribute to the UG?
      • Contributions to the DG: Which sections did you contribute to the DG? Which UML diagrams did you add/updated?
      • Contributions to team-based tasks
      • Review/mentoring contributions: Links to PRs reviewed, instances of helping team members in other ways.
      • Contributions beyond the project team:
        • Evidence of helping others e.g. responses you posted in our forum, bugs you reported in other team's products,
        • Evidence of technical leadership e.g. sharing useful information in the forum

    Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score e.g., explain how deep the enhancement is, why it is complete, how hard it was to implement etc.

    • OPTIONAL Contributions to the Developer Guide (Extracts): Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.
    • OPTIONAL Contributions to the User Guide (Extracts): Reproduce the parts in the User Guide that you wrote.

    PPP Format

    • File name (i.e., in the repo): docs/team/github_username_in_lower_case.md e.g., docs/team/goodcoder123.md
    • Follow the example in the AddressBook-Level3
    • PDF file submission: not required.


    • Product Website: Update website (home page,Ui.png, AboutUs.md etc.) on GitHub. Ensure the website is auto-published.

    3 Prepare for the practical exam

    • After reading the above 2, we strongly recommend you read ahead the info given in the item 6 below as well, to know in advance what will happen during the PE itself.

    4 Ensure the code is RepoSense-compatible

    • Ensure your code is and the code it attributes to you is indeed the code written by you, as explained below:

      • Go to the tp Code Dashboard. Click on the </> icon against your name and verify that the lines attributed to you (i.e., lines marked as green) reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines.

      • More info on how to make the code RepoSense compatible:

    FAQ What if someone took over a feature from another team member?


    5 Attend the practical exam Fri, Nov 15th 1600-1800

    • Ensure you read the instructions on PE Preparation (given in item 5 above)
    • Attend the practical test, to be done during the weekly briefing.

    6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    • In the very unlikely event that the PE had to be cancelled due to technical issues, attend the makeup PE on this day.
    • Note: This is not an alternative option for students who could not attend the PE, as all students need to do the PE at the same time.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Code contributed: Give a link to your code on tP Code Dashboard. The link is available in the Project List Page -- linked to the icon under your profile picture.
    • Enhancements implemented: A summary of the enhancements you implemented.
    • Contributions to the UG: Which sections did you contribute to the UG?
    • Contributions to the DG: Which sections did you contribute to the DG? Which UML diagrams did you add/updated?
    • Contributions to team-based tasks
    • Review/mentoring contributions: Links to PRs reviewed, instances of helping team members in other ways.
    • Contributions beyond the project team:
      • Evidence of helping others e.g. responses you posted in our forum, bugs you reported in other team's products,
      • Evidence of technical leadership e.g. sharing useful information in the forum

    Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score e.g., explain how deep the enhancement is, why it is complete, how hard it was to implement etc.

    • OPTIONAL Contributions to the Developer Guide (Extracts): Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.
    • OPTIONAL Contributions to the User Guide (Extracts): Reproduce the parts in the User Guide that you wrote.

    PPP Format

    • File name (i.e., in the repo): docs/team/github_username_in_lower_case.md e.g., docs/team/goodcoder123.md
    • Follow the example in the AddressBook-Level3
    • PDF file submission: not required.


    • Product Website: Update website (home page,Ui.png, AboutUs.md etc.) on GitHub. Ensure the website is auto-published.

    3 Prepare for the practical exam

    • After reading the above 2, we strongly recommend you read ahead the info given in the item 6 below as well, to know in advance what will happen during the PE itself.

    4 Ensure the code is RepoSense-compatible

    • Ensure your code is and the code it attributes to you is indeed the code written by you, as explained below:

      • Go to the tp Code Dashboard. Click on the </> icon against your name and verify that the lines attributed to you (i.e., lines marked as green) reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines.

      • More info on how to make the code RepoSense compatible:

    FAQ What if someone took over a feature from another team member?


    5 Attend the practical exam Fri, Nov 15th 1600-1800

    • Ensure you read the instructions on PE Preparation (given in item 5 above)
    • Attend the practical test, to be done during the weekly briefing.

    6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600

    • In the very unlikely event that the PE had to be cancelled due to technical issues, attend the makeup PE on this day.
    • Note: This is not an alternative option for students who could not attend the PE, as all students need to do the PE at the same time.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week13/project.page-vue-render.js b/schedule/week13/project.page-vue-render.js index a2ca9ade76..217cf4fbb9 100644 --- a/schedule/week13/project.page-vue-render.js +++ b/schedule/week13/project.page-vue-render.js @@ -1,7 +1,7 @@ var pageVueRenderFn = function anonymous( ) { -with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('p'),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_c('div',[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(4),_v(" "),_m(5),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"86%","y":"92%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.6")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to put in final touches while minimizing delivery risks "),_c('span',{staticClass:"dimmed"},[_v("i.e., risks of regressions or deadline overruns")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the quality necessary for a public release.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Freeze features. Strictly limit changes to bug fixes only.")])])])])]),_v(" "),_m(6),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of our policy on reuse")]),_v(" (e.g., "),_c('mark',[_v("how to give credit for reused code")]),_v("):")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Policy on reuse "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"policy-on-reuse"}},[_v("Policy on reuse "),_c('small',[_c('small',[_c('span',{staticClass:"badge rounded-pill bg-light text-danger"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#policy-on-reuse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('p',[_c('strong',[_v("Scope:")]),_v(" The policies on reuse apply to all project deliverables that are normally expected to be your own work (i.e., code, code comments, documentation, diagrams, images, etc.) unless stated otherwise.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse is encouraged. However, note that reuse has its own costs")]),_v(" (such as the learning curve, additional complexity, usage restrictions, and unknown bugs). Furthermore, you will not be given credit for work done by others. Rather, you will be given credit for "),_c('em',[_v("reusing")]),_v(" work done by others.")]),_v(" "),_c('ul',[_c('li',[_v("You are allowed to reuse work from your classmates or past students, subject to following conditions:\n"),_c('ul',[_c('li',[_v("The work has been shared publicly by us or the authors.")]),_v(" "),_c('li',[_v("You clearly give credit to the original author(s).")])])]),_v(" "),_c('li',[_v("You are allowed to reuse code from external sources, subject to following conditions:\n"),_c('ul',[_c('li',[_v("You clearly give credit to the original author/source.")]),_v(" "),_c('li',[_v("You do not violate the license under which the work has been released. Please "),_c('strong',[_v("do not use 3rd-party images/audio")]),_v(" in your software unless they have been specifically released to be used freely. Just because you found it in the Internet does not mean it is free for reuse.")])])]),_v(" "),_c('li',[_c('mark',[_v("Always get permission from us before you reuse")]),_v(" third-party libraries. Please post your 'request to use 3rd party library' in our "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". That way, the whole class get to see what libraries are being used by others.\n"),_c('ul',[_c('li',[_v("Our approval is given based on compliance with the course. Compliance with the license of the reused software is entirely your responsibility. While we don't anticipate such a case, any liability from improper reuse of a third-party library is to be borne by the person who reused it (i.e., not NUS).")]),_v(" "),_c('li',[_v("Once a 3rd party library has been approved for one student/team, it can be used freely by others without asking for approval again.")])])])]),_v(" "),_c('div',{attrs:{"id":"cite-reuse-immediately"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Keep track of code reuse")]),_v(" If you reuse/adapt code from elsewhere, cite the source in code immediately. Otherwise you will not remember the source of code reuse later. Not citing the original source can land you in trouble for plagiarism.")])])],1),_v(" "),_c('div',{attrs:{"id":"using-tool-generated-code"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_c('strong',[_v("FAQ: Can I use code generated by AI tools")]),_v(" (e.g., Copilot, ChatGPT)?")]),_c('br'),_v(" "),_c('strong',[_v("Answer:")]),_v(" We don't explicitly prohibit you from using those tools, but we strongly discourage you from using them in a way that hinders your learning. For example,")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Use a tool such as GitHub co-pilot to increase the productivity of writing code (e.g., auto-complete the next bit of code).")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Write the required code yourself, and then, use the tool to generate alternative implementations, compare, and use that experience to improve your own coding skills.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" When troubleshooting/debugging, use a tool to help you locate the problem.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])]),_v(" Give the problem description to the tool and get it to generate the code for you, and use it directly in your submission, and claim it as your own.")])]),_v(" "),_c('p',[_v("Other caveats:")]),_v(" "),_c('ul',[_c('li',[_v("Using such tools can result in your code being same as others in the class. If such code was flagged for plagiarism, \"It was generated by a tool\" will not be a valid excuse. Therefore, if you use (possibly with minor changes) a non-trivial code snippet generated by a tool (e.g., an entire method), it is safer to acknowledge in the code as a case of code reuse.")]),_v(" "),_c('li',[_v("Those tools sometimes can confidently give you the wrong answer. So, have a healthy level of scepticism about the accuracy of the code generated by such tools.")])])])],1),_v(" "),_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Automated plagiarism checks ahead!")]),_v(" We'll be using automated plagiarism checks to detect uncredited reuses of content from other CS2103 tP's i.e., tP's done by other teams in this batch and "),_c('mark',[_c('em',[_v("all")]),_v(" previous batches")]),_v(". These checks will be done "),_c('em',[_v("after")]),_v(" the final submissions. The cases detected will be verified and reported to the university administration for disciplinary action. As you know, NUS enforces a penalty of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("F")]),_v(" grade for the entire course (with no option to S/U or withdraw from the course) for plagiarism offenses.")])]),_v(" "),_c('box',[_c('h4',{attrs:{"id":"giving-credit-for-reused-work"}},[_v("Giving credit for reused work"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#giving-credit-for-reused-work","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Given below are how to give credit for things you reuse from elsewhere. These requirements are specific to this course "),_c('span',{staticClass:"dimmed"},[_v("i.e., not applicable outside the course (outside the course, you should follow the rules specified by your employer and the license of the reused work)")])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("used a third party library")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Individual project (iP): Mention in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README")]),_v(" file (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Team project (tP):\n"),_c('ul',[_c('li',[_v("Mention in the Developer Guide (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Mention in "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-ppp"}},[_v("Project Portfolio Page")]),_v(" if the library has a significant relevance to the features you implemented.")],1)])])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("reused code snippets found on the Internet")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. from StackOverflow answers")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred code in another software")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred project code by current/past student")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If you read the code to understand the approach and implemented it yourself, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("inspired")]),_v(" by https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted code from elsewhere but modified it significantly, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("adapted")]),_v(" from https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted a non-trivial code block (possibly with minor modifications "),_c('span',{staticClass:"dimmed"},[_v("renaming, layout changes, changes to comments, etc.")]),_v("), also mark the code block as reused code (using "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-authorTags"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(" with the "),_c('mark',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-reused")])]),_v(" suffix)"),_c('br'),_v("\nFormat:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" {yourGithubUsername}-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//{Info about the source...}")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v("{"),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_v("Reused "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("code")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(possibly with minor modifications)")]),_v(" here ...}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}}),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])])]),_v("\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example of reusing a code snippet (with minor modifications):"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_v("persons = getList()\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" johndoe-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Reused from https://stackoverflow.com/a/34646172")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// with minor modifications")]),_v("\n")]),_c('span',[_v("Collections.sort(persons, "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("new")]),_v(" Comparator() {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-meta"}},[_v("@Override")]),_v("\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("int")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("compare")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(CustomData lhs, CustomData rhs)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" lhs.customInt > rhs.customInt ? -"),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("1")]),_v(" : "),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("0")]),_v(";\n")]),_c('span',[_v(" }\n")]),_c('span',[_v("});\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" persons;\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])],1)]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('strong',[_v("Giving credit for reused images")]),_v(" (and other media assets): Ideally, the source should be credited where the asset appears. For example, if you reused an image in your GUI, you can credit the source where a screenshot of the GUI showing that image appears first in your user guide. In addition, you can also acknowledge the sources in your GitHub project's landing page (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(")")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB3 code")]),_v(": If your team project code follows a design similar to AB3, that doesn't mean you need to credit AB3 -- this is because a brownfield project is "),_c('em',[_v("expected")]),_v(" to follow existing code/design where possible, in the interest of consistency. This type of reuse need not be acknowledged/credited specifically.")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB4 code")]),_v(": If you reused any code from "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(", cite it as you would cite reuse from any other external source.")])]),_v(" "),_c('p',[_c('strong',[_v("Giving credit for reusing from course materials")]),_v(" (e.g., course textbook, tutorials, instructional resources from se-education.org) is not required, although you are welcome to do so. Reason: Those materials were created by the teaching team for you to use/reuse.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse within the team")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing code written by a team member)")]),_v(" need not be mentioned explicitly. However, you should factor in such reuse when you estimate effort contributed by each team member.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse of documentation")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing a UG/DG section)")]),_v(" is no different from code reuse. Such reuse should be credited as well.")]),_v(" "),_c('p',[_c('strong',[_v("Citing the use of AI-generated/assisted work")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using GitHub Copilot for project work)")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If the use of the tool was localized into a few places "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it to write a few methods/classes only)")]),_v(", cite its use in comments near where you used it.")]),_v(" "),_c('li',[_v("If the use was more widespread "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it as an auto-complete tool during most of your coding)")]),_v(", cite the usage (i.e., which tool, who used it, the extent of use) in the following location instead (i.e., no need to cite in code comments):\n"),_c('ul',[_c('li',[_v("iP: in the README file")]),_v(" "),_c('li',[_v("tP: in the DG, under the Acknowledgements section")])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-authorTags"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project mid-v1.3 (extract) →")]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-ppp"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project → Deliverables → Project Portfolio Page")]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:deliverablesPPP-teamTasks"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Team-Based Tasks")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('em',[_v("Team-tasks")]),_v(" are the tasks that "),_c('em',[_v("someone")]),_v(" in the team has to do.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Examples of team-tasks")])]},proxy:true}])},[_v(" "),_c('span',{attrs:{"id":"example-team-tasks"}},[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])]),_c('p')],1)],1)]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])],1),_c('p')],1)])])],1)])])])],1),_c('p')])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-fix-pe-d-bugs"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(7),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-fix-pe-d-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(8),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("After the PE-D")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-d-after-the-session"}},[_c('span',{staticClass:"badge bg-primary"},[_v("PE-D")]),_v(" "),_c('span',{staticClass:"text-primary"},[_v("After the session")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-d-after-the-session","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The relevant bug reports will be transferred to your issue tracker")]),_v(" within a day after the session is over. Once you have received the bug reports for your product, you can decide whether you will act on reported issues before the final submission v1.6. For some issues, the correct decision could be to reject or postpone to a version beyond v1.6."),_c('br'),_v("\nReminder: There is no penalty for any of the bugs you received in the PE-D.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('box',{attrs:{"type":"info","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-angry",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-info"},[_c('strong',[_v("Dealing with \"What the h___ the tester was thinking?\" type bug reports")])])]),_v(" "),_c('p',[_v("Some bug reports will make you angry because they seem baseless, wrong, rude etc. It's still possible to get value from such bug reports though:")]),_v(" "),_c('ul',[_c('li',[_v("After you got over the initial indignation, dig deeper to see if there's even the slightest possibility that there is a bug. For example, consider this scenario:\n"),_c('ol',[_c('li',[_v("The tester claims a certain command doesn't work.")]),_v(" "),_c('li',[_v("All your team members tried the exact same command and it works as advertised. What the h___ the tester is trying to pull here?")]),_v(" "),_c('li',[_v("In reality, the error is actually caused by a duplicate entry in the database resulting from a previous command; the tester didn't mention that command in the bug report (because s/he didn't realize the two are connected).")])])]),_v(" "),_c('li',[_v("The reported bug might be non-existent but the tester's screw up can indicate other areas to improve. For example, the tester reports a missing feature that is clearly mentioned as 'not implemented' in the UG, but perhaps the UG can be improved to make that fact harder to miss?")]),_v(" "),_c('li',[_v("What exactly about the bug report that makes you angry? Remind yourself not to do the same offence when you report bugs yourself in the future.")])]),_v(" "),_c('p',[_v("Use the pain of dealing with this kind of bug reports as an opportunity to develop the following mindset:")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(a)")]),_c('div',[_c('p',[_c('strong',[_v("The product is "),_c('em',[_v("guilty until proven innocent")])]),_v(": If the bug report has even a "),_c('em',[_v("hint")]),_v(" of something amiss with the product, it's your (not the tester's) responsibility to try and prove if it is really a problem or not. Why? because finding a bug is a win for "),_c('em',[_v("you")]),_v(" -- as you can then fix it and thereby avoid the embarrassment of releasing a buggy product.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(b)")]),_c('div',[_c('p',[_c('strong',[_v("A crappy bug report is better than no bug report")]),_v(": If the bug actually exists, it is better to have "),_c('em',[_v("some")]),_v(" indication about it than none at all. In a real project, a tester that fails to find bugs can cause more harm to your career than a tester who finds bugs but doesn't report them well.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(c)")]),_c('div',[_c('p',[_c('strong',[_v("I "),_c('em',[_v("used")]),_v(" to get angry at bug reports, but not anymore")]),_v(": If you work hard, take pride in the quality of your work, it's no wonder that you get angry when others find faults with your work incorrectly. Aim to move past that phase where you take bug reports personally. The sooner you can tackle any sh*tty bug report calmly and objectively, the sooner you'll rise to the 'professional' software engineer level.")])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you have received stray bug reports")]),_v(" (i.e., bug reports that don't seem to be about your project), do let us know ASAP (email the prof).")]),_v(" "),_c('li',[_c('strong',[_v("You can navigate to the original bug report")]),_v(" (via the back-link provided in the bug report given to you) and post in that issue thread to communicate with the tester who reported the bug "),_c('span',{staticClass:"dimmed"},[_v("e.g. to ask for more info")]),_v(", etc. However, the tester is not obliged to respond. Note that simply replying to the bug report in your own repo will not notify the tester.\n"),_c('ul',[_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Do not argue with the tester to try to convince that person that your way is correct/better. If at all, you can gently explain the rationale for the current behavior but do not waste time getting involved in long arguments. If you think the suggestion/bug is unreasonable, just thank the tester for their view and discontinue to discussion.")])])]),_v(" "),_c('li',[_c('strong',[_v("Aim to "),_c('mark',[_v("do a systematic triaging of issues received")])]),_v(". Some suggestions:\n"),_c('ul',[_c('li',[_v("Close duplicate issues.")]),_v(" "),_c('li',[_v("Use labels (create new labels if necessary) to,\n"),_c('ul',[_c('li',[_v("differentiate "),_c('em',[_v("bugs")]),_v(" from the rest (e.g., feature suggestions/flaws).")]),_v(" "),_c('li',[_v("indicate priority of the bugs that need fixing.")])])]),_v(" "),_c('li',[_v("Assign each bug to the person who should fix it.")])])]),_v(" "),_c('li',[_c('strong',[_v("You may ignore "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type/severity.*")]),_v(" labels given by the tester.")]),_v(" They will not affect you or the tester either way -- they were there just for the testers to practice. You may apply your own type/severity labels if you wish."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" In particular, beware of simply following the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" given by the tester; it is your job to decide the correct type of the issue. e.g., What the tester labeled as a "),_c('em',[_v("bug")]),_v(" might actually be a "),_c('em',[_v("feature flaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report is simply a feature suggestion")]),_v(", you can take note of it and close it (to reduce clutter in the issue tracker, and to make it easy for the teaching team to track your progress on dealing with PE-D issues). Similarly, you can close PE-D issues not relevant to v1.6.")])]),_v(" "),_c('box',{attrs:{"type":"wrong","seamless":""}},[_c('p',[_c('strong',[_v("Note that listing bugs as 'known bugs' in the UG or specifying "),_c('em',[_v("unreasonable")]),_v(" constraints in the UG to make bugs 'out of scope' will not exempt those bugs from the final grading.")]),_v(" That is, PE testers can still earn credit for reporting those bugs and you will still be penalized for them."),_c('br'),_v("\nHowever, a product is allowed to have 'known limitations' "),_c('span',{staticClass:"dimmed"},[_v("(e.g., a daily expense tracking application meant for students is unable to handle expenses larger than $999)")]),_v(" as long as they don't degrade the product's use within the intended scope. They will not be penalized.")])]),_v(" "),_c('box',{attrs:{"type":"info","tags":"m--cs2103","seamless":""}},[_c('p',[_c('strong',[_v("Even bugs inherited from AB3 need to be fixed.")]),_v(" As mentioned in a previous week, even bugs you inherited from AB3 need fixing "),_c('span',{staticClass:"dimmed"},[_v("(because \"we inherited it from the previous dev team\" is not a valid excuse to leave a bug unfixed)")]),_v(". If you are unsure if something is such a bug that need fixing, please post in the forum.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Identify bugs you missed in the PE-D:")]),_v(" Visit the issue tracker of the team you tested and see bugs reported by others who tested the same product. Identify bugs you missed (if any). That knowledge might help you find similar bugs in your own product as well as find more bugs during the PE.")])])],1)])],1),_c('p'),_v(" "),_m(9),_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the same bug is reported in the PE?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1),_v(" "),_m(10),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q1: Performance of PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("In this context, a good bug report,")]),_v(" "),_c('ul',[_c('li',[_v("has a descriptive title,")]),_v(" "),_c('li',[_v("has enough details,")]),_v(" "),_c('li',[_v("severity/type labels chosen are not too far off,")]),_v(" "),_c('li',[_v("is written in a non-confrontational tone, and")]),_v(" "),_c('li',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])]),_v(" "),_c('p',[_v("Rate each tester on the following scale:")]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Poor")]),_v(" "),_c('th',[_v("Below expectations")]),_v(" "),_c('th',[_v("Meets expectations")]),_v(" "),_c('th',[_v("Exceeds expectations")]),_v(" "),_c('th',[_v("Greatly exceeds expectations")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("no bug reports from this tester")]),_v(" "),_c('td',[_v("just a few bug reports, and none are good")]),_v(" "),_c('td',[_v("3-5 good bug reports")]),_v(" "),_c('td',[_v("6-8 good bug reports")]),_v(" "),_c('td',[_v("9 or more good bug reports")])])])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q2: Rank PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("Rank the PE-D testers based on their performance (five rank 1 to the top performing tester):")]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester A")]),_v(": rank __"),_c('br'),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester B")]),_v(": rank __"),_c('br'),_v("\n...")])]),_c('p')],1),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_v("PE-D bug titles will be prefixed with tester ID e.g., ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE-D][Tester A] UG does not load")]),_v(") to make it easy for you to "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("using GitHub issue tracker's filters/search box")]},proxy:true}])},[_v("filter")]),_v(" bugs reported by each tester."),_c('br'),_v("\nFurthermore, tester ID mapping (i.e., who is Tester A, Tester B, etc.) will be sent to you via email within 1 day after the PE-D.")],1)])]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-submit-final-deliverables-tue-nov-12th-14-00"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(11),_v(" "),_m(12),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-submit-final-deliverables-tue-nov-12th-14-00","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_m(13),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Penalty for late submission")]),_v(" (per file): "),_c('br'),_v(" "),_c('mark',[_v("-1 mark for missing the deadline (up to 2 hour of delay).")]),_c('br'),_v("\n-2 for an "),_c('em',[_v("extended delay")]),_v(" (up to 24 hours late)."),_c('br'),_v("\nPenalty for delays beyond 24 hours is determined on a case by case basis.\n"),_m(14)]),_v(" "),_m(15),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Follow submission instructions closely")]),_v(". "),_c('mark',[_v("Any non-compliance will be penalized")]),_v(". e.g. wrong file name/format."),_c('br'),_v("\nCanvas might automatically add a file name suffix (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-1.pdf")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-2.pdf")]),_v(", ...) if you upload a file multiple times. You can safely ignore that suffix.")]),_v(" "),_m(16)]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('big',[_c('strong',[_v("Submissions:")])])],1)]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',{attrs:{"id":"tip-how-to-convert-to-pdf"}},[_c('box',{attrs:{"id":"caution-on-pdf-conversion","type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])],1),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Side benefits for early submissions:")]),_v(" Given that "),_c('em',[_v("using buffers to reduce the risk of deadline overruns")]),_v(" is a learning outcome of this course, we strongly encourage setting an internal submission deadline a few hours earlier than the actual deadline. As an incentive, we plan to perform some checks on early submissions and inform you if we found issues with your submission "),_c('span',{staticClass:"dimmed"},[_v("(e.g., incorrect file name/format)")]),_v(", thus giving you a chance to fix them before the deadline and avoid a penalty for it.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("You may use automated tools to improve documentation:")]),_v(" e.g., tools such as Grammarly may be used to improve the writing quality and find grammar errors.")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("The icon "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" indicates team submissions.")]),_v(" Only one person need to submit on behalf of the team but we recommend that others help verify the submission is in order."),_c('br'),_v(" "),_c('mark',[_v("We will not entertain requests to limit late penalties of team submissions to one person")]),_v(" even if the delay was one person's fault. That is, the responsibility (and the penalty) for team submissions are to be shared by the whole team rather than burden one person with it.")])])],1),_v(" "),_m(17),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Executable "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should be an executable jar file")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Should be "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v(" i.e., it can be used by end-users")]},proxy:true}])},[_c('em',[_v("releasable")])])],1),_v(". While some features may be scheduled for later versions, the features in v1.6 should be good enough to make it usable by at least some of the target users.")]),_v(" "),_c('li',[_v("Also note the following constraint:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')])])])],1),_c('p'),_v(" "),_m(18),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Source Code "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should match v1.6 deliverables")]),_v(" i.e., executable, docs, website, etc.")]),_v(" "),_c('li',[_c('strong',[_v("To be delivered as a Git repo.")]),_v(" Ensure your GitHub team repo is updated to match the executable.")])])])])])],1),_c('p'),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_v("Reminder: double-check to ensure the code attributed to you by RepoSense is correct.")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Making the Code RepoSense-Compatible "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_c('ul',[_c('li',[_v("Go to the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tp Code Dashboard")]),_v(". Click on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("")]),_v(" icon against your name and verify that the "),_c('mark',[_v("lines attributed to you (i.e., lines marked as green)")]),_v(" reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines."),_c('br'),_v(" "),_c('img',{attrs:{"src":"/website/admin/images/greenLines.png","width":"600"}})])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("More info on how to make the code RepoSense compatible:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-2"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-2"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_m(19),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → User Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(20),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Developer Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_m(21),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Project Portfolio Page "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])]),_c('p')],1)])])],1),_c('p'),_v(" "),_m(22),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Product Website "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_v("When setting up your team repo, you would be configuring "),_c('strong',[_v("the GitHub Pages feature to publish your documentation")]),_v(" as a website.")]),_v(" "),_c('h4',{attrs:{"id":"website-home-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Home page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-home-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Update to match your product.")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('h4',{attrs:{"id":"website-ui-png"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ui-png","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('mark',[_v("Ensure the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" matches the current product")])])])]),_v(" "),_c('div',{staticClass:"indented-level3",attrs:{"id":"tips-for-product-screenshot"}},[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)]),_v(" "),_c('h4',{attrs:{"id":"website-aboutus-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("AboutUs Page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-aboutus-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use a suitable profile photo.")])])]),_v(" "),_c('div',{staticClass:"indented-level2",attrs:{"id":"profile-photo"}},[_c('p',[_v("The purpose of the profile photo is for the reader to identify you. Therefore, choose a "),_c('mark',[_v("recent individual photo showing your face clearly")]),_v(" (i.e., not too small) -- somewhat similar to a passport photo. Given below are some examples of good and bad profile photos."),_c('br'),_v(" "),_c('pic',{staticStyle:{"width":"365.33px"},attrs:{"eager":"","src":"/website/admin/images/profilephotos.png"}})],1),_v(" "),_c('p',[_v("If you are uncomfortable posting your photo due to security reasons, you can post a lower resolution image so that it is hard for someone to misuse that image for fraudulent purposes. If you are concerned about privacy, you may use "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/File:Portrait_placeholder.png"}},[_v("a placeholder image")]),_v(" in place of the photo in course-related documents that are publicly visible.")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Include a link to each person's PPP page.")])]),_v(" "),_c('li',[_c('strong',[_v("Team member names:")]),_v(" you may use the full name, part of the name, or GitHub username of the team member.")])]),_v(" "),_c('h4',{attrs:{"id":"website-ug-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("UG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ug-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])]),_v(" "),_c('h4',{attrs:{"id":"website-dg-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("DG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-dg-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])])])])])],1),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-prepare-for-the-practical-exam"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(23),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-prepare-for-the-practical-exam","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Overview")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('strong',[_v("PE is not entirely a pleasant experience, but is an essential component")]),_v(" that aims to increase the quality of the tP work, and the rigor of tP grading.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("more details on the motivation and objectives...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The upfront objective of the PE is to increase the rigor of project grading.")]),_v(" Assessing most aspects of the project involves an element of subjectivity. As the project counts for a large percentage of the final grade, it is not prudent to rely on evaluations of tutors alone as there can be significant variations between how different tutors assess projects. That is why we collect more data points via the PE to minimize the chance of your project being affected by evaluator-bias.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates your testing skills")]),_v(", done as the following two-parts:\n"),_c('ol',[_c('li',[_c('strong',[_v("You will be given a chance to find bugs in a different software.")]),_v(" Furthermore, you will be given an opportunity to "),_c('s',[_v("defend your bug reports against any possible objections")]),_v(" interact with the developers (anonymously) to refine the bug report further "),_c('span',{staticClass:"dimmed"},[_v("e.g., correct the severity level if the level you chose initially was incorrect")]),_v(". If you report possible bugs that turn out to be actual bugs, you earn marks (provided the product actually had bugs in the first place).")]),_v(" "),_c('li',[_c('strong',[_v("Your product will be subjected to a rigorous testing")]),_v(" and you will be given a chance to point out any inaccuracies in the bugs reported. You will lose marks for any bugs that turned out to be real bugs, but only if your work has more bugs than a certain bar.")])])]),_v(" "),_c('li',[_c('strong',[_v("The above two can lead to high-rigor, "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("based on how well you achieve the objectives of testing, as opposed to indirect measures such as number of test cases")]},proxy:true}])},[_c('em',[_v("outcome-based")])]),_v(" evaluation of your testing skills")],1),_v(". The alternative is to rely solely on other easy-to-measure metrics "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the number of test cases, test coverage, test LoC etc.)")]),_v(" which we don't think as good representations of your actual testing skills.\n"),_c('strong',[_v("The "),_c('em',[_v("ultimate")]),_v(" objective of the PE is not even the higher rigor of grading.")]),_v(" Because of the PE, you will realize that any bugs are very likely to be detected, which means you will work extra hard to avoid bugs; and THAT is the real benefit. Ultimately, "),_c('span',{staticClass:"text-success"},[_c('strong',[_v("what we want is for you to internalize a higher standard for testing and a lower tolerance for bugs in your own code")])]),_v(" -- something that can have a longer-lasting impact on your future careers, beyond the mere course grade.")]),_v(" "),_c('li',[_c('strong',[_v("Problem: There is no way we can carry out the above-mentioned")]),_v(" two-part evaluation at a high-level of rigor if using tutors as testers, or using an automated testing script. "),_c('span',{staticClass:"dimmed"},[_v("e.g., some tutors might not have the motivation to try hard enough to find bugs, and it will be hard to find tutors willing to spend many hours testing products so near to their own exams.")]),_c('br'),_v(" "),_c('strong',[_v("Solution: Get the two parts of the evaluation to feed each other")]),_v(" by getting student to test each other's products.")]),_v(" "),_c('li',[_c('strong',[_v("The fact that you are testing products created by your classmates and objecting to bugs reported by your classmates can make this a rather 'unpleasant' experience")]),_v(". You might feel like "),_c('em',[_v("being pitted against each other")]),_v(", or as if "),_c('em',[_v("you are forced to bring down each other")]),_v(". But as you read above, it is a necessary evil for this evaluation to be even possible. Given the actual goal is to get you to create products with very few bugs, we think switching off the 'collaborative learning' mode for just a few days is a price worth paying to achieve that goal. After all, the PE is an evaluation activity (not a "),_c('em',[_v("learning activity")]),_v(") and happens "),_c('em',[_v("after")]),_v(" the regular learning period is over.")]),_v(" "),_c('li',[_c('strong',[_v("You are not taking marks from someone else")]),_v(" -- at least, don't think of it that way. The point of contention is 'is this really a bug?' which is independent of the people involved. Furthermore, the reward for detecting a bug and the penalty for having a bug in your code are calculated independently.")]),_v(" "),_c('li',[_c('strong',[_v("Still, "),_c('em',[_v("none of us")]),_v(" likes it when others point out problems of our work")]),_v(". Some of us don't even like pointing out problems of others' work. But "),_c('mark',[_v("we just have to learn not to take bug reports personally")]),_v(". Another important intended outcome is to be able to report bugs in a way that doesn't feel like you are "),_c('em',[_v("attacking")]),_v(" or trying to "),_c('em',[_v("sabotage")]),_v(" the dev team.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates aspects other than testing")]),_v(" e.g., your product evaluation skills, effort estimation skills etc. When evaluating those aspects in particular, they are "),_c('mark',[_v("not graded solely based on peer ratings")]),_v(". Rather, PE data are cross-validated with tutors' grades to identify cases that need further investigation. When peer inputs are used for grading, they are usually combined with tutors' grades with appropriate weight for each. In some cases ratings from team members are given a higher weight compared to ratings from other peers, if that is appropriate.")])])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("The PE is divided into four phases")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 1: Bug Reporting")])]),_v(": "),_c('span',{attrs:{"id":"pe-p1-desc"}},[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part I")]),_v(" "),_c('strong',[_v("Product Testing")]),_v(" [60 minutes] -- to focus on reporting bugs in the product (but can report documentation bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part II")]),_v(" "),_c('strong',[_v("Evaluating Documents")]),_v(" [30 minutes] -- to focus on reporting bugs in the UG and DG (but can report product bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part III")]),_v(" "),_c('strong',[_v("Overall Evaluation")]),_v(" [15 minutes] -- to give overall evaluation of the product, documentation, effort, etc.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part IV")]),_v(" "),_c('strong',[_v("Trimming Bugs")]),_v(" [half a day] -- For testers to select up to 7 bugs to send to the dev team.")])])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 2: Developer Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p2-desc"}},[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 3: Tester Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p3-desc"}},[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-secondary"},[_c('strong',[_v("Phase 4: Tutor Moderation")])]),_v(": "),_c('span',{attrs:{"id":"pe-p4-desc"}},[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")]),_c('br'),_c('br')])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Grading")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Your performance in the practical exam will affect your final grade and your peers', as explained in "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('em',[_v("Admin: Project Grading")])]),_v(" section.")]),_v(" "),_c('li',[_v("As such, we have put in measures to identify and "),_c('mark',[_v("penalize insincere/random evaluations")]),_v(".")]),_v(" "),_c('li',[_v("Also see:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Notes on how marks are calculated for PE "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p')])])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Preparation, Restrictions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-preparation-restrictions"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Preparation, Restrictions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-preparation-restrictions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"pe-mode-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Mode: you can choose between remote or F2F")]),_v(" (we'll use a Canvas survey to collect your preferred mode):\n"),_c('ul',[_c('li',[_c('strong',[_v("Remote mode")]),_v(": This is the "),_c('mark',[_v("recommended mode")]),_v(". Proctored via Zoom. You'll need to join the Zoom session from a quiet place (i.e., conducive to an exam) at which you can set up a Zoom device for proctoring."),_c('br'),_v("\nChoose this mode only if you are able to comply with the Zoom proctoring requirements given further down.")]),_v(" "),_c('li',[_c('strong',[_v("F2F mode")]),_v(": Attend the PE at the lecture venue (UTown-AUD2)."),_c('br'),_v("\nChoose only if you are unable to use the remote mode (reason: higher the number of F2F attendees, higher the risk of Wi-Fi speed issues and GitHub throttling issues).")])])])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Those opting for the F2F mode can ignore any Zoom-related points")]),_v(" in the instructions below.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("When")]),_v(": "),_c('mark',[_v("Last lecture slot of the semester")]),_v(" (Fri, Nov 15th). Remember to "),_c('mark',[_v("join 15-30 minutes earlier")]),_v(" than usual lecture start time. The Zoom link will be given to you closer to the day.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("PE Phase 1 will be conducted under exam conditions. For the remote mode, "),_c('mark',[_v("we will be following the "),_c('a',{attrs:{"href":"https://mysoc.nus.edu.sg/academic/e-exam-sop-for-students/"}},[_v("SoC's E-Exam SOP")])])]),_v(", combined with the deviations/refinements given below. Any non-compliance will be dealt with similar to a non-compliance in the final exam."),_c('br')])])]),_v(" "),_c('div',{attrs:{"id":"pe-proctoring-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Remote mode proctoring will be done via Zoom.")]),_v(" No admission if the following requirements are not met.\n"),_c('ul',[_c('li',[_c('strong',[_v("You need two Zoom devices")]),_v(" (PC: chat, audio "),_c('s',[_v("video")]),_v(", Phone: video, "),_c('s',[_v("audio")]),_v("), unless you have an external webcam for your PC.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" To change the Zoom display name as required by the PE, join the Zoom call, go to the 'Participation' panel, and search for yourself. Then, click on 'More', followed by 'Rename'.")]),_v(" "),_c('li',[_c('strong',[_v("Add your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE_seat_number]")]),_v(" in front of the "),_c('em',[_v("first name")]),_v(" of your Zoom display name")]),_v(", in your Zoom devices. "),_c('mark',[_v("Seat numbers can be found in "),_c('a',{attrs:{"href":"https://docs.google.com/spreadsheets/d/e/2PACX-1vSUbcJpMC5OdJkr_K6VxDwAkkrwJsqAFSPwHmZq88EbOdAWIPMeYvDQDYOUEcsEYVwACmAz5hH0W0ZY/pubhtml?gid=0&single=true"}},[_v("here")])]),_v(" about 2 days before the PE. e.g.,\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18] John Doe")]),_v(" ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("M18")]),_v(" is the seat number)")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18][PC] John Doe")]),_v(" (for the PC, if using a phone as well)")])])]),_v(" "),_c('li',[_c('strong',[_v("Set your camera")]),_v(" so that "),_c('em',[_v("all")]),_v(" the following are visible:\n"),_c('ol',[_c('li',[_v("your face (side view, "),_c('mark',[_v("no mask")]),_v(")")]),_v(" "),_c('li',[_v("your hands")]),_v(" "),_c('li',[_v("the work area (i.e., the tabletop)")]),_v(" "),_c('li',[_v("the computer screen"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/zoomCameraExample.png","width":"362"}})],1)])])])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Strongly recommended to join the Zoom waiting room "),_c('mark',[_v("15-30 minutes before the start time")]),_v(".")]),_v(" Admitting you to the Zoom session can take some time. You need to be in the meeting and ready to start the PE by 4.05pm"),_c('br'),_v(" "),_c('strong',[_v("If on F2F mode:")]),_v(" Strongly recommended to arrive at lecture venue (UTown-AUD2) around 10-15 minutes early. We can allow only 5 minutes (i.e., until 4.05pm) for you to get ready to start the PE.")]),_v(" "),_c('li',[_c('strong',[_v("In case of Zoom outage")]),_v(", we'll fall back on MS Teams (MST). Make sure you have MST running and have joined the "),_c('a',{attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82"}},[_v("MST Team for the class")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recording the screen is not required.")])]),_v(" "),_c('li',[_c('strong',[_v("You are allowed to use head/ear phones.")]),_v(" But no talking allowed (unless you are talking to the invigilator) -- so, no talking/singing to yourself as this can be mistaken for a rule violation.")]),_v(" "),_c('li',[_c('strong',[_c('mark',[_v("Only one screen")]),_v(" is allowed")]),_v(" (for both remote mode and F2F mode). If you want to use the secondary monitor, you should switch off the primary monitor. The screen being used should be fully visible in the Zoom camera view."),_c('br'),_v("\nIf using a second device for Zoom proctoring, the screen of that device should only be used for Zoom.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use the public chat channel to ask questions")]),_v(" from the prof. If you do, you might accidentally reveal which team you are testing.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use more than one CATcher instance")]),_v(" at the same time. Our grading scripts will red-flag you if you use multiple CATcher instances in parallel.")]),_v(" "),_c('li',[_c('strong',[_v("Use MS Teams (not Zoom) private messages to communicate with the prof.")]),_v(" Zoom sessions are invigilated by tutors, not the prof.")]),_v(" "),_c('li',[_c('strong',[_v("Do not view video Zoom feeds of others")]),_v(" while the testing is ongoing. Keep the video view minimized.")]),_v(" "),_c('li',[_c('strong',[_v("Bug reporting will be done using CATcher")]),_v(", similar to,")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"primary","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("PE-D Preparation")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("Ensure that you have accepted the invitation to join the GitHub org used by the course. Go to "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1"}},[_v("https://github.com/nus-cs2103-AY2425S1")]),_v(" to accept the invitation.")])]),_v(" "),_c('li',[_c('p',[_v("Ensure you have access to a "),_c('strong',[_v("computer that is able to run course projects")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. has the right Java version")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Ensure you can use "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")])]),_v(" on your computer. You should have done this when you smoke-tested CATcher earlier in the semester.")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("If not using CATcher")])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"not-using-catcher-warning"}},[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('div',{attrs:{"id":"pe-create-repo"}},[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Have a good screen grab tool")]),_v(" with annotation features so that you can quickly take a screenshot of a bug, annotate it, and post in using CATcher."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('kbd',[_v("Ctrl")]),_v("+"),_c('kbd',[_v("V")]),_v(" to paste a picture from the clipboard into a text box in a bug report.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("[Optional] Have a good screen recording tool")]),_v(" if you plan to use screen recording clips as part of your bug reports. Ensure that your screen recording tool can create small files as CATcher doesn't allow files bigger than 10Mb."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})]),_v(" As the CATcher support for uploading screen recordings is new and limited, use it only if strictly necessary -- use screenshots for other cases.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('span',{staticClass:"text-danger"},[_v("Download the product to be tested")])]),_v(".")])])]),_v(" "),_c('tabs',{attrs:{"active":"1","add-class":"ml-4"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified which team to test (likely to be in the morning of PE-D day), download the JAR file and the UG PDF file from the team's latest release.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified of the download location, download the zip file that bears your name. The password required to unzip it will be given to you at the start of the PE.")])])])],1),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Testing tips")])])]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Use easy-to-remember patterns in test data.")]),_v(" For example, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("12345678")]),_v(" as a phone number while testing and it appears as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2345678")]),_v(" somewhere else in the UI, you can easily spot that the first digit has gone missing. But if you used a random number instead, detecting that bug won't be as easy. Similarly, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Bee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Benny Lee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Charles Pereira")]),_v(" as test data (note how the names start with letters A, B, C), it will be easy to detect if one goes missing, or they appear in the incorrect order.")]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Go wide before you go deep")]),_v(". Do a light testing of all features first. That will give you a better idea of which features are likely to be more buggy. Spending equal time for all features or testing in the order the features appear in the UG is not always the best approach.")])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("During the bug reporting periods (i.e., "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")]),_v(" and "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part II")]),_v("), do not use websites/software not in the list given below.")]),_v(" If you need to visit a different website or use another software, please ask for permission first.\n"),_c('ul',[_c('li',[_v("Website: Canvas")]),_v(" "),_c('li',[_v("Website/software: MSTeams (only to communicate with the prof of Tech support)")]),_v(" "),_c('li',[_v("Website: Course website "),_c('span',{staticClass:"dimmed"},[_v("(e.g., to look up PE info)")])]),_v(" "),_c('li',[_v("Software: CATcher, any text editor, any screen grab/recording software")]),_v(" "),_c('li',[_v("Software: PDF reader "),_c('span',{staticClass:"dimmed"},[_v("(to read the UG/DG or other references such as the textbook)")])]),_v(" "),_c('li',[_v("Software: A text editor or word processing software "),_c('span',{staticClass:"dimmed"},[_v("(to keep notes while testing)")])])])]),_v(" "),_c('li',[_c('mark',[_c('strong',[_v("Do not visit GitHub in")]),_v(" "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")])]),_v(" unless you are going there to download a file the team has provided and is needed for testing. You may visit GitHub during part II and part III.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use any other software running")]),_v(" in the background e.g., Telegram chat.")]),_v(" "),_c('li',[_c('strong',[_v("This is a "),_c('em',[_v("manual")]),_v(" testing session")]),_v(". Do not use any test automation tools or custom scripts.")]),_v(" "),_c('li',[_c('strong',[_v("You may use any digital/physical notes")]),_v(" during the PE "),_c('span',{staticClass:"dimmed"},[_v("e.g., a list of things to check")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recommended to read the guidelines the dev team will follow when responding to your bug reports later")]),_v(", given in the panel below. This will help decide what kind of bugs to report.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs reported during the PE should be the result of your own testing")]),_v(". "),_c('span',{staticClass:"text-danger"},[_v("Reporting bugs found by others as your own will be reported as a case of academic dishonesty")]),_v(" (severity is similar to cheating during the final exam).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Guidelines for the dev team to follow when triaging PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("[Within 24 hours prior to the PE] Get CATcher 'warmed-up' for the PE")]),_v("."),_c('br'),_v(" "),_c('mark',[_v("Strongly recommended")]),_v(" to do the following about a day in advance, so that there is enough lead time to sort out any CATcher-related problems "),_c('em',[_v("before")]),_v(" the PE.\n"),_c('ol',[_c('li',[_v("Login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")]),_v(",\nwhile choosing the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(" as the session.")]),_v(" "),_c('li',[_v("Allow CATcher to create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(", when asked.")]),_v(" "),_c('li',[_v("Create a dummy bug report. Edit it. Delete it."),_c('br'),_v("\nCaution: Do not reuse these dummy bug reports (i.e., by editing them later) to submit real PE bugs.\nAs they were created outside the PE duration, they will be ignored by PE bug processing scripts.")]),_v(" "),_c('li',[_v("If you encounter any problems, post in the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")])])])])])])],1),_c('p'),_v(" "),_m(24)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-ensure-the-code-is-reposense-compatible"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(25),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-ensure-the-code-is-reposense-compatible","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{attrs:{"id":"midV13-repoSenseCompatible"}},[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_m(26),_v(" "),_c('p'),_v(" "),_m(27)])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking-2"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-3"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-3"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(28),_v(" "),_m(29),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(30),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Phases")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-phase-1-bug-reporting"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 1: Bug Reporting")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-bug-reporting","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_c('p'),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-i-product-testing-60-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part I")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Product Testing [60 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-i-product-testing-60-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >50%, a substantial bonus if >70%) of your bugs are "),_c('em',[_c('strong',[_v("accepted as reported")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" of the bug match the values you chose initially and the bug is accepted by the team).")]),_v(" "),_c('p',[_v("Take away: Aim for the "),_c('em',[_v("correct")]),_v(" severity/type etc. rather than the one that gives you most marks, as the former can end up earning you more marks in the end anyway.")])]),_v(" "),_c('p',[_c('strong',[_v("Test the product and report bugs")]),_v(" as described below. You may report both product bugs and documentation bugs during this period.")]),_v(" "),_c('div',[_c('box',[_c('h5',{attrs:{"id":"testing-instructions-for-pe-and-pe-d"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_c('strong',[_v("Testing instructions for PE and PE-D")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-instructions-for-pe-and-pe-d","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h6',{attrs:{"id":"a-launching-the-jar-file"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("a) Launching the JAR file")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#a-launching-the-jar-file","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Get the jar file to be tested:")])]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the "),_c('em',[_v("latest")]),_v(" JAR file from the team's releases page, if you haven't done this already.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the zip file from the given location (to be given to you at least a few hours before the PE), if you haven't done that already.")]),_v(" "),_c('li',[_v("The file is zipped using a two-part password.\n"),_c('ul',[_c('li',[_v("We will email you the second part in advance, via email (it's unique to each student). Keep it safe, and have it ready at the start of the PE.")]),_v(" "),_c('li',[_v("At the start of the PE, we'll give you the first part of the password (common to the whole class). Use combined password to unzip the file, which should give you another zip file with the name suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("_inner.zip")]),_v(".")]),_v(" "),_c('li',[_v("Unzip that second zip file normally (no password required). That will give you a folder containing the JAR file to test and other PDF files needed for the PE. "),_c('mark',[_v("Warning: do not run the JAR file while it is still inside the zip file")]),_v("."),_c('br'),_v("\nIgnore the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("padding_file")]),_v(" found among the extracted files. "),_c('span',{staticClass:"dimmed"},[_v("Its only purpose is to mask the true size of the JAR file so that someone cannot guess which team they will be testing based on the zip file size.")])]),_v(" "),_c('li',[_v("Recommended: Try above steps using the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103/website-base/files/14849276/JohnDoe.zip"}},[_v("this sample zip file")]),_v(" if you wish (first part of the password: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-")]),_v(", second part: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password2")]),_v(" i.e., you should use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-password2")]),_v(" to unzip it)."),_c('br'),_v("\nUse the JAR file inside it to try the steps given below as well, to confirm your computer's Java environment is as expected and can run PE jar files.")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"important","id":"tp-jar-testing-steps","seamless":""}},[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])]),_v(" "),_c('box',{attrs:{"type":"info"}},[_c('p',[_c('strong',[_c('span',{staticClass:"large"},[_v("If the product doesn't work at all:")])]),_v(" If the product fails catastrophically "),_c('span',{staticClass:"dimmed"},[_v("e.g., cannot even launch, or even the basic commands crash the app")]),_v(", do the following:")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Check the UG")]),_v(" of the team, to see if there are extra things you need to do before launching the JAR."),_c('br'),_v(" "),_c('strong',[_v("Confirm that you are using Java 17")]),_v(" and using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to run the JAR, as explained in points above.")]),_v(" "),_c('li',[_c('strong',[_v("Contact our head TA")]),_v(" via MS Teams (name: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Kim Hyeongcheol")]),_v(", NUSNET: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dcskh")]),_v(") and give him"),_c('br'),_v("\n(a) "),_c('strong',[_v("a screenshot")]),_v(" of the error message, and"),_c('br'),_v("\n(b) "),_c('strong',[_v("your GitHub")]),_v(" username.")]),_v(" "),_c('li',[_c('strong',[_v("Wait for him to give you a fallback")]),_v(" team to test."),_c('br'),_v("\nContact the prof (via MS Teams) if you didn't get a response from Kim within 5 minutes.")]),_v(" "),_c('li',[_c('strong',[_v("Delete bug reports you submitted for the previous team")]),_v(" (if any), using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("You should not go back to testing the previous team")]),_v(" "),_c('em',[_v("after")]),_v(" you've been given a fallback team to test.")])])]),_v(" "),_c('h6',{attrs:{"id":"b-what-to-test"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("b) What to test")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#b-what-to-test","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Test the product "),_c('mark',[_v("based on the User Guide (PDF version)")]),_v(" available from their releases page on GitHub.")]),_v(" "),_c('li',[_v("Do "),_c('mark',[_c('em',[_v("system")]),_v(" testing first")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product work as specified by the documentation?")]),_v(". If there is time left, you can "),_c('mark',[_v("do "),_c('em',[_v("acceptance")]),_v(" testing as well")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product solve the problem it claims to solve?")]),_v(".")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Test "),_c('mark',[_v("based on the Developer Guide")]),_v(" (Appendix named "),_c('em',[_v("Instructions for Manual Testing")]),_v(") "),_c('mark',[_v("and the User Guide")]),_v(" PDF files.")]),_v(" The testing instructions in the Developer Guide can provide you some guidance but if you follow those instructions strictly, you are unlikely to find many bugs. You can deviate from the instructions to probe areas that are more likely to have bugs."),_c('br'),_v(" "),_c('strong',[_v("If the provided UG/DG PDF files have serious issues")]),_v(" (e.g., some parts seem to be missing), ask prof for permission to use the Web versions of UG/DG instead.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The DG appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(" (if it exists) gives some enhancements the team is planning for the near future. The feature flaws these enhancements address are 'known' -- reporting them will not earn you any credit."),_c('br'),_v("\nHowever, you can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaws")]),_v(" bugs if you think these enhancements themselves are flawed/inadequate."),_c('br'),_v("\nYou can also report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs if any of the enhancements in this list combines more than one enhancement.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You may do both "),_c('em',[_v("system testing")]),_v(" and "),_c('em',[_v("acceptance testing")])]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("Be careful when copying commands from the UG")]),_v(" (PDF version) to the app as some PDF viewers can affect the pasted text. If that happens, you might want to open the UG in a different PDF viewer."),_c('br'),_v("\nIf the command you copied spans multiple lines, check to ensure the line break did not mess up the copied command.")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"c-what-bugs-to-report"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("c) What bugs to report?")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#c-what-bugs-to-report","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("You may report functionality bugs, UG bugs, and feature flaws.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You can also post suggestions on how to improve the product."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Be diplomatic when reporting bugs or suggesting improvements. For example, instead of criticising the current behavior, simply suggest alternatives to consider.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Report functionality bugs:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Do not post suggestions but if the product is missing a critical functionality that makes the product less useful to the intended user, it can be reported as a bug of type "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Type.FeatureFlaw")]),_v(". The dev team is allowed to reject bug reports framed as mere suggestions or/and lacking in a convincing justification as to why the omission or the current design of that functionality is problematic.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You may also report documentation bugs (UG bugs in particular) but keep in mind that there is another time (i.e., part II) set aside for reporting documentation bugs too.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p')])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"d-how-to-report-bugs"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("d) How to report bugs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#d-how-to-report-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Post bugs as you find them")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not wait to post all bugs at the end)")]),_v(" because "),_c('span',{staticClass:"text-danger"},[_v("bug reports created/updated after the allocated time will not count.")]),_v(" Even minor updates (such as changing a label) outside the allowed time window will invalidate that bug.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Launch CATcher, and login to the correct profile (when CATcher asks, consent to creating a new repo):\n"),_c('ul',[_c('li',[_v("PE Dry Run: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE Dry run")])]),_v(" "),_c('li',[_v("PE: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")])])])]),_v(" "),_c('li',[_v("Post bugs using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("If you encounter a 'Failed to fetch' error")]),_v(" during CATcher login, try again. If it still fails, try a different network e.g., your mobile phone's hotspot.")]),_v(" "),_c('li',[_c('strong',[_v("If GitHub prompts you to 're-authorize' CATcher")]),_v(" (this happens if GitHub detects a rush of login requests from the same account), just re-authorize as requested.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('p',[_v("If you 'warmed up' CATcher for the PE earlier, you should already have a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" in your GitHub account, created by CATcher during that warming up. If that is not the case, create a repo to post your bug reports as given in the panel below:")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Creating a repo to post PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Post bug reports in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" repo.")]),_v(" "),_c('li',[_v("The whole description of the bug should be in the issue description i.e., "),_c('mark',[_v("do not add comments to the issue")]),_v(".")]),_v(" "),_c('li',[_v("Choose exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label and exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.severity")]),_v(" label.")])])],1)])],1)],1),_v(" "),_c('h6',{attrs:{"id":"e-bug-report-format"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("e) Bug report format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#e-bug-report-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Each bug should be a separate issue "),_c('span',{staticClass:"dimmed"},[_v("i.e., do not report multiple problems in the same bug report.")]),_c('br'),_v("\nIf there are multiple bugs in the same report, the dev team will select only one of the bugs in the report and discard the others.")]),_v(" "),_c('li',[_v("When reporting similar bugs, it is safer to report them as separate bugs because there is no penalty for reporting duplicates while putting multiple bugs in the same report can reduce your bug count (see the previous point). But as submitting multiple bug reports take extra time, if you are quite sure they will be considered as "),_c('em',[_v("duplicates")]),_v(" by the dev team later, you can report them together, to save time.")]),_v(" "),_c('li',[_v("Write good quality bug reports; "),_c('mark',[_v("poor quality or incorrect bug reports will not earn credit")]),_v("."),_c('br'),_v("\nRemember to give enough details for the receiving team to reproduce the bug. If the receiving team cannot reproduce the bug, you will not be able to get credit for it.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Reminder: Qualities of a good bug report")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has a descriptive title")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has enough details e.g., "),_c('mark',[_v("steps to reproduce, expected, actual, and screenshots")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("severity/type labels chosen are not too far off")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("is written in a non-confrontational tone")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" label to the bug report. Bug reports without a severity label are considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" (lower severity bugs earn lower credit)"),_c('br')])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label to the issue.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)]),_v(" "),_c('ul',[_c('li',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("If you need to include "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(" symbols in your bug report")]),_v(", you can either use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\")]),_v(" to escape them (i.e., use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\>")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x \\< y")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x < y")]),_v(") or wrap it inside back-ticks."),_c('br'),_v("\nReason: CATcher and GitHub strips out content wrapped in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(", for security reasons.")])])],1)],1),_v(" "),_c('p',[_c('mark',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("When in doubt, choose the lower severity:")])]),_v(" If the severity of a bug seems to be smack in the "),_c('em',[_v("middle")]),_v(" of two severity levels, choose the lower severity (unless much closer to the higher one than the lower one).")]),_v(" "),_c('ul',[_c('li',[_v("Reason: The teaching team follow the same policy when adjudicating disputed severity levels in the last phase\nof the PE.")]),_v(" "),_c('li',[_v("As the tester, you might feel like you are throwing away marks by choosing a lower priority; but the lower\npriority has a lower risk of being disputed by the dev team, giving you (and the dev team)\na better chance of earning bonus marks for accuracy (which will be substantial)."),_c('br'),_v("\nTo make your case stronger, state in the bug report why you think the bug might even qualify for a higher severity, while you actually chose the lower one.")]),_v(" "),_c('li',[_v("In this section, there will be a "),_c('em',[_v("mass identity check")])])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":"","id":"identity-check-info","tags":"m--cs2103"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Mass identity check")])])]},proxy:true}])},[_v(" "),_c('p',[_v("When the invigilator announces an identity check,")]),_v(" "),_c('ol',[_c('li',[_v("remove mask (if any)")]),_v(" "),_c('li',[_v("turn towards the camera")]),_v(" "),_c('li',[_v("move closer to the camera (but do not adjust the camera position) -- no need to show the student card")]),_v(" "),_c('li',[_v("hold that pose until the invigilator has taken a screenshot and asks you to go back to the PE activity.")])]),_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_v("Please comply quickly")]),_v(" as non-compliance can delay the PE for everyone. This is expected to take no more than 15 seconds.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Some students will be testing less/more buggy products than others? Isn't that unfair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("As each product is tested by 4-5 testers, after all PE bugs have been finalized, we know how 'buggy' each product is. We then use that information for calculating your PE-related marks. So, the marks are calibrated to match the bugginess of the product you tested.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested has hardly any bugs?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("If the total bugs found (by "),_c('em',[_v("all")]),_v(" testers) in a product is below a certain level, we compensate those testers by increasing the weightage given to PE-D performance, and their dev-testing results.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested is very buggy? Am I expected to find all those bugs")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No. Given the PE has only a short time, we don't expect you to find "),_c('em',[_v("all")]),_v(" bugs in the product. To get full marks, you only need to report a certain percentage of the bugs (e.g., half), or a certain quantity of bugs (the quantity also factors in the nature of the bug e.g., severity), whichever is lower.")])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-ii-evaluating-documents-30-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part II")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Evaluating Documents [30 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-ii-evaluating-documents-30-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use this slot mainly to report documentation bugs")]),_v(" (but you may report product bugs too). You may report bugs related to the UG and the DG."),_c('br'),_v("\nOnly the content of the UG/DG PDF files (not the online version) should be considered.")]),_v(" "),_c('li',[_c('strong',[_v("For each bug reported, cite evidence and justify.")]),_v(" For example, if you think the explanation of a feature is too brief, explain what information is missing and why the omission hinders the reader."),_c('br'),_v("\nDo not report bugs that are not contained within in the UG and DG pdf files (e.g., bugs in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("You may visit the team's project on GitHub during this portion")]),_v(", for the purpose of verifying the accuracy of documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., to check if a diagram matches the code")]),_v(". You are also allowed to download and open the team's code in a code editor.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You "),_c('em',[_v("may")]),_v(" report grammar issues")]),_v(" as bugs but note that minor grammar issues that don't hinder the reader are allowed to be categorized as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" (by the receiving team) -- such bugs earn only small amount or credit for the tester (hence, do not waste time reporting too many minor grammar errors).")])])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iii-overall-evaluation-15-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part III")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Overall Evaluation [15 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iii-overall-evaluation-15-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("To be submitted via TEAMMATES. You are expected to complete this during the PE session itself, but "),_c('mark',[_v("you have until the end of the day to submit (or revise) your submissions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("If you have to valid reason to leave the PE early")]),_v(" (e.g., having another exam right after the PE), you may leave after part II has ended and do part III later -- but note that if you fail to submit this by the hard deadline (i.e., end of the day), you will receive an "),_c('span',{staticClass:"text-danger"},[_v("automatic penalty")]),_v(".")]),_v(" "),_c('li',[_v("The TEAMMATES email containing the submission link should have reached you the day before the PE. If you didn't receive it by then, you can request it to be resent from "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("this page")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If TEAMMATES submission page is slow/fails to load")]),_v(" (all of you accessing it at the same time is likely to overload the server), wait 3-5 minutes and try again. "),_c('span',{staticClass:"text-danger"},[_v("Do not refresh the page repeatedly")]),_v(" as that will overload the server even more, and recovery can take even longer.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"peek":"","panelId":"important-questions-included-in-the-evaluation"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"important-questions-included-in-the-evaluation"}},[_v("Important questions included in the evaluation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#important-questions-included-in-the-evaluation","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"projectGrading-featureFit-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-userGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-devGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-effort-instructions"}},[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])]),_v(" "),_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("[Optional] Concerns or any noteworthy observations about the product you evaluated")])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Finally, what did you like about the product you tested?")])],1)])]),_v(" "),_c('p')],1),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iv-trimming-bugs-half-a-day"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part IV")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Trimming bugs [~half a day]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iv-trimming-bugs-half-a-day","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("This segment gives testers a second chance revisit their bug reports, and choose upto 7 bugs that they wish to send to the dev team.")]),_v(" They will be allowed to change bug type/severity too (but will not be allowed to change bug title or the description)."),_c('br'),_v("\nObjectives:\n"),_c('ul',[_c('li',[_v("Testers can correct their type/severity choices in case they chose incorrectly during the PE due to time pressure.")]),_v(" "),_c('li',[_v("Testers get a chance to withdraw lower impact (or uncertain) bugs so that there is less work for the dev team during the next phase.")])])]),_v(" "),_c('li',[_c('strong',[_v("Procedure:")]),_v(" coming soon ...")])]),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-2-developer-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 2: Developer Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-2-developer-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")]),_c('p'),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Mon, Nov 18th 2359")])]),_v(" "),_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_c('strong',[_v("Yes, that can be better!")])]),_v(" For each bug report you receive, if you think a software engineer who takes pride in their own work would say \"yes, that can be better!\", accept it graciously, even if you can come up with "),_c('em',[_v("some")]),_v(" argument to justify the current behavior. "),_c('br'),_v("\nEven when you still want to defend the current behavior, instead of pretending that the behavior was a deliberate choice to begin with, you can say something like,")]),_v(" "),_c('blockquote',[_c('p',[_v("\"Thanks for raising this. Indeed, it didn't occur to us. But now that we have thought about it, we still feel ...\"")])]),_v(" "),_c('p',[_c('strong',[_c('em',[_v("Some")]),_v(" bugs are 'expected'.")]),_v(" Given the short time you had for the tP and your inexperience in SE team projects, this work is not expected to be totally bug free. The grading scheme factors that in already -- i.e., your grade will not suffer if you accept a few bugs in this phase.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >60% substantial bonus if >80%) of bugs are "),_c('em',[_c('strong',[_v("accepted as triaged")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(" of the bug match the ones you chose).")])]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("It's not bargaining!")])]),_v(" "),_c('p',[_v("When the tester and the dev team cannot reach a consensus, the teaching team will select either the dev team position or the tester position as the final state of the bug, whichever appear to be closer to being reasonable. "),_c('span',{staticClass:"text-danger"},[_v("The teaching team will not come up with our own position, or choose a middle ground.")])]),_v(" "),_c('p',[_v("Hence, do not be tempted to argue for an unreasonable position in the hope that you'll receive something less than asked but still in your favor e.g., if the tester chose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" but you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(", don't argue for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" in the hope that the teaching team will decide a middle ground of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(". It's more likely that the teaching team will choose the tester's position as yours seems unreasonable.")]),_v(" "),_c('p',[_v("More importantly, this is not a bargaining between two parties; it's "),_c('strong',[_v("an attempt to determine the true nature of the bug, and your ability to do so (which is an important skill)")]),_v(".")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('mark',{staticClass:"text-success"},[_c('strong',[_v("Favor "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" over "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")])])])]),_v(" "),_c('p',[_v("If there is even the slightest chance that the change directly suggested (or indirectly hinted at) by a bug report is an improvement that you "),_c('em',[_v("might")]),_v(" consider doing in a future version of the product, choose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v("."),_c('br'),_v("\nChoose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" only for bug reports that are clearly incorrect (e.g., the tester misunderstood something)."),_c('br'),_v("\nAccordingly, it is typical a team to have a lot more "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs and very few "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" bugs.")]),_v(" "),_c('p',[_v("Note that "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs earn a small amount of credit for the tester without any penalty for the dev team, unless there is an unusually high number of such bugs for a team.")])]),_v(" "),_c('p',[_v("Bug reviewing is recommended to be done as a team as some of the decisions need team consensus.")]),_v(" "),_c('box',[_c('p',[_c('strong',[_v("Instructions for Reviewing Bug Reports")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Don't freak out if there are a lot of bug reports.")]),_v(" Many can be duplicates and some can be "),_c('em',[_v("false positives")]),_v(". In any case, we anticipate that all of these products will have some bugs and our penalty for bugs is not harsh. Furthermore, it depends on the severity of the bug. Some bug may not even be penalized.")]),_v(" "),_c('li',[_c('strong',[_v("Nit-picking is a good sign")]),_v(": If you receive a lot of nit-picking type of bugs that make you roll your eyes, it means testers were unable to find more serious bugs. That's a good thing.")]),_v(" "),_c('li',[_c('strong',[_v("Not exactly zero-sum")]),_v(": As mentioned earlier, the penalty for having a specific bug is not the same as the reward for reporting that bug (it's not a "),_c('em',[_v("zero-sum")]),_v(" game). For example, the reward for testers will be higher (because we don't expect the products to have that many bugs after they have gone through so much prior testing)")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Penalty for a minor bug (e.g., "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("an indicative value only; the actual value depends on the severity, type, and the number of assignees")]},proxy:true}])},[_v("-0.15")]),_v(") is unlikely to make a difference in your final grade")],1),_v(", especially given that the penalty applies only if you have more than a certain amount of bugs."),_c('br')]),_v(" "),_c('p',[_v("For example, in a typical case a developer might be assigned 5+ "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" bugs before the penalty even starts affecting their marks.")]),_v(" "),_c('p',[_v("Accordingly, we hope you'll "),_c('strong',[_v("accept bug reports graciously")]),_v(" (rather than fight tooth-and-nail to reject "),_c('em',[_v("every")]),_v(" bug report received) if you think the bug is within the ballpark of 'reasonable'. Those minor bugs are really not worth stressing/fighting over.")])]),_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"info"},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-hard-hat",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("CATcher does not come with a UG, but the UI is fairly intuitive (there are tool tips too). Do post in the forum if you need any guidance with its usage.")]),_v(" "),_c('li',[_v("Tip: If you think others might be editing the same issues at the same time, use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Sync")]),_v(" button at the top to force-sync your view with the latest data from GitHub.")])])]),_v(" "),_c('ul',[_c('li',[_v("Go to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher Web app")]),_v(", and login to the profile "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(". It will show all the bugs assigned to your team, divided into three sections:\n"),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" - Issues that your team has not processed yet.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Responded")]),_v(" - Your job is to get all issues to this category.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Faulty Issues")]),_v(" - e.g., Bugs marked as duplicates of each other, or causing circular "),_c('em',[_v("duplicate")]),_v(" relationships. Fix the problem given so that no issues remain in this category.")])])]),_v(" "),_c('li',[_v("Respond to the bug reports shown.")])])],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',{attrs:{"id":"warning-use-catcher"}},[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug seems to be for a different product")]),_v(" (i.e. wrongly assigned to your team), let us know ASAP.")]),_v(" "),_c('li',[_c('strong',[_v("If the bug is reported multiple times")]),_v(",\n"),_c('ul',[_c('li',[_v("Mark "),_c('span',{staticClass:"text-danger"},[_v("all copies "),_c('mark',[_v("EXCEPT one")])]),_v(" as duplicates of the one left out (let's call that one the "),_c('em',[_v("original")]),_v(") using the "),_c('span',{staticClass:"fas fa-check-square",attrs:{"aria-hidden":"true"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A Duplicate of")]),_v(" tick box.")]),_v(" "),_c('li',[_v("For each group of duplicates, all duplicates should point to one "),_c('em',[_v("original")]),_v(" i.e., no multiple levels of duplicates, and no cyclical duplication relationships.")]),_v(" "),_c('li',[_v("If the duplication status is eventually accepted, all duplicates will be assumed to have inherited the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" from the "),_c('em',[_v("original")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("If you cannot reproduce the bug based on the info given by the tester")]),_v(" you are still expected to make a "),_c('em',[_v("reasonable attempt")]),_v(" to go beyond the information provided by the tester to reproduce the bug, if there is clear evidence of something wrong."),_c('br'),_v("\nFor example, the screenshot in the bug report clearly shows an error message that should not appear, but you can't reproduce the error message based on the info given by the tester. Perhaps the error was caused by something else the tester did although the tester didn't realize it is connected to the error. In this case, based on the error message, you might be in a better position to figure out the real cause of the error. If you don't, the decision can go against you in a later phase if either the tester or the moderator figures out how to reproduce the error and the moderator decides that it is something you should have been able to figure out yourself.")])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Apply one of these labels")]),_v(" (if missing, we assign: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(")")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',[_v("Response")]),_v(" Labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(": You accept it as a valid bug.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(": It is a valid issue, but fixing it is less important than the work done in the current version of the product "),_c('span',{staticClass:"dimmed"},[_v("e.g., it was not related to features delivered in v1.6 or lower priority than the work already done in v1.6")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Rejected")]),_v(": What tester treated as a bug is in fact the "),_c('em',[_v("expected")]),_v(" and "),_c('em',[_v("correct")]),_v(" behavior (from the user's point of view), or the tester was mistaken in some other way. "),_c('span',{staticClass:"dimmed"},[_v("Note: Disagreement with the bug severity/type given by the tester is not a valid reason to reject the bug.")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.CannotReproduce")]),_v(": You are unable to reproduce the behavior reported in the bug after multiple tries.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.IssueUnclear")]),_v(": The issue description is not clear. Don't post comments asking the tester to give more info. The tester will not be able to see those comments because the bug reports are anonymous.")])]),_v(" "),_c('p',[_v("Only the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(" bugs are counted against the dev team. While "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" are not counted against the dev team, they can earn a small amount of consolation marks for the tester. The other three do not affect marks of either the dev team or the tester, except when calculating bonus marks for accuracy.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original bug type assigned to the bug")]),_v(", you may change it to the correct type.")])]),_v(" "),_c('div',{staticClass:"indented",attrs:{"id":"type-labels"}},[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1),_v(" "),_c('p',[_c('strong',[_v("If a bug fits multiple types "),_c('em',[_v("equally")]),_v(" well")]),_v(", the team is free to choose the one they think the best match, but keep the type chosen by the tester if it is one of the types that fits the bug equally well.")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original severity assigned to the bug")]),_v(", you may change it to the correct level.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you need the teaching team's inputs when deciding on a bug")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., if you are not sure if the UML notation is correct)")]),_v(", post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". Remember to "),_c('mark',[_v("quote the issue number shown in CATcher")]),_v(" (it appears at the end of the issue title)."),_c('br'),_v("\nKeep in mind that the bug triaging accuracy affects your marks, and therefore, the teaching team prefers not to dictate a specific response, type, or severity for a particular bug report (i.e., that decision should be yours). Nevertheless, we can provide some general comments relevant to the issue at hand. Additionally, we encourage other students to chime in with their opinions, as such discussions have learning value.")])]),_v(" "),_c('div',{staticClass:"indented-level1",attrs:{"id":"additionalGuidelinesForBugTriaging"}},[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-2"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-2"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-2"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-2"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide who should take responsibility for the bug")]),_v(". Use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Assignees")]),_v(" field to assign the issue to that person(s). There is no need to actually fix the bug though. It's simply an indication/acceptance of responsibility. "),_c('strong',[_v("If there is no assignee, we will distribute the penalty for that bug (if any) equally among all team members")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., if the penalty is -0.4 and there are 4 members, each member will be penalized -0.1")]),_v(".\n"),_c('ul',[_c('li',[_v("If it is not easy to decide the assignee(s), we recommend (but not enforce) that the feature owner should be assigned bugs related to the feature, Reason: The feature owner should have defended the feature against bugs using automated tests and defensive coding techniques.")]),_v(" "),_c('li',[_v("It is also fine to not assign a bug to anyone, in which case the penalty will be divided equally among team members.")])])])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_v("As far as possible, "),_c('mark',[_c('strong',[_v("choose the correct "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(", assignees, and duplicate status even for bugs you are not accepting")])]),_v(". Reason: your "),_c('em',[_v("non-acceptance")]),_v(" may be rejected in a later phase, in which case we need to grade it as an accepted bug."),_c('br'),_v(" "),_c('strong',[_v("If a bug's 'duplicate' status was rejected later")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., the tester says it is not really a duplicate and the teaching team agrees with the tester)")]),_v(", it will inherit the response/type/severity/assignees from the 'original' bug that it was claimed to be a duplicate of.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Justify your response.")]),_v(" For all the following cases, "),_c('mark',[_v("you must add a comment justifying your stance")]),_v(". Testers will get to respond to all those cases and will be considered by the teaching team in later phases (when resolving disputed bug reports)."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" If you don't provide a justification and the tester disagrees with your decision, the teaching team will have no choice but to rule in favor of the tester.")]),_v(" "),_c('ul',[_c('li',[_v("downgrading severity")]),_v(" "),_c('li',[_v("non-acceptance of a bug")]),_v(" "),_c('li',[_v("changing the bug type")]),_v(" "),_c('li',[_v("non-obvious duplicate")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Do we need to justify even if we accept the bug "),_c('em',[_v("as is")]),_v("?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No need to provide a justification if you accept the bug without "),_c('em',[_v("any")]),_v(" changes to it.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: So, those who write more code will be hit with more bugs? How's that fair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Penalty for bugs is applied based on bug "),_c('em',[_v("density")]),_v(", not bug count. For example, if Ann contributed twice as much implementation effort as Tom, and was assigned twice as many bugs as Tom, both will receive similar penalties, as both had similar bug densities.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug is real but the tester used the wrong label (e.g., used the wrong "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v("). Can we reject that bug?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("A bug is a bug irrespective of the label used. Instead of rejecting, rectify the label.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug the tester reported is legit but the expected behavior tester suggested is not correct?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You should accept the bug but state that you disagree with the expected/suggested behavior. Reason: the main job of the tester is to detect bugs; suggesting a solution is optional.")])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_v("You can also refer to the below guidelines:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-2"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-3-tester-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 3: Tester Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-3-tester-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")]),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Start:")]),_v(" Within 1 day after Phase 2 ends."),_c('br')]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" While you are waiting for Phase 3 to start, comments will be added to the bug reports in your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/pe")]),_v(" repo, to indicate the response each received from the receiving team. "),_c('span',{staticClass:"text-danger"},[_v("Please do not edit any of those comments or reply to them via the GitHub interface.")]),_v(" Doing so can invalidate them, in which case the grading script will assume that you agree with the dev team's response. Instead, wait till the start of the Phase 3 is announced, after which you should use CATcher to respond.")])]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Thu, Nov 21st 2359")])]),_v(" "),_c('ul',[_c('li',[_v("In this phase you will get to state whether you agree or disagree with the dev team's response to the bugs you reported. If a bug reported has been subjected to any of the below by the dev team, you can record your objections and the reason for the objection.\n"),_c('ul',[_c('li',[_v("not accepted")]),_v(" "),_c('li',[_v("severity downgraded")]),_v(" "),_c('li',[_v("bug type changed")]),_v(" "),_c('li',[_v("bug flagged as duplicate "),_c('span',{staticClass:"dimmed"},[_v("(Note that you still get credit for bugs flagged as duplicates, unless you reported both bugs yourself. Nevertheless, it is in your interest to object to incorrect duplicate flags because when a bug is reported by more testers, it will be considered an 'obvious' bug and will earn slightly less credit than otherwise)")])])])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_v("Don't feel upset if the dev team did not totally agree")]),_v(" with most of the bugs you reported. That is to be expected, given you had very short time to make those bug decisions while the dev team had a lot more time to deliberate about them. Some may have given unreasonable (in your opinion) arguments against your bug reports; not to worry, just give your counter-arguments and leave it to the teaching team to decide (in the next phase) which position is more reasonable.")]),_v(" "),_c('p',[_v("However, "),_c('mark',[_v("if the dev team's argument is not too far from 'reasonable', "),_c('strong',[_v("it may be better to agree than disagree")])]),_v("."),_c('br'),_v("\nReason: an incorrect counterargument at this phase will lower your "),_c('em',[_v("accuracy")]),_v(" more than an incorrect decision made during the testing phase (because you now have more time to think about the bug) i.e., changing your position after you had more time to think of it and after having seen more information is encouraged, compared to sticking to your initial position 'no matter what'.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you would like to revise your own initial type/severity")]),_v(" in response to the team's inputs, you can state that in your explanation "),_c('span',{staticClass:"dimmed"},[_v("e.g., you rated the bug "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" and the team changed it to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" but now you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")])]),_v(" (do not change the original labels yourself though).")]),_v(" "),_c('li',[_v("You can also refer to the below guidelines, mentioned during the previous phase as well:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" PE → Phase 2 → Additional Guidelines for Bug Triaging")])]},proxy:true}])},[_v(" "),_c('div',[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging-2"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging-2"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging-2","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-3"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-3"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-3"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-3"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1)])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-3"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("If the dev team disagreed with an aspect (i.e., type/severity/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., accept vs not accept")]},proxy:true}])},[_v("validity")]),_v(") and you now agree with the dev team's position, it will not hurt your accuracy rating. Here are some examples (for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v("):")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Tester choice")]),_v(" "),_c('th',[_v("Dev choice")]),_v(" "),_c('th',[_v("Tester reaction")]),_v(" "),_c('th',[_v("Teacher decision")]),_v(" "),_c('th',[_v("Dev accuracy")]),_v(" "),_c('th',[_v("Tester accuracy")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_v("no effect")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low ")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])])])])])])]),_v(" "),_c('ul',[_c('li',[_v("If you do not respond to a dev response, we'll assume that you agree with it.")]),_v(" "),_c('li',[_v("Procedure:")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("When the phase has been announced as open, login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher"}},[_v("CATcher")]),_v(" as usual (profile: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(").")]),_v(" "),_c('li',[_v("For each issue listed in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" section:\n"),_c('ul',[_c('li',[_v("Click on it to go to the details, and read the dev team's response.")]),_v(" "),_c('li',[_v("If you disagree with any of the items listed, tick on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("I disagree")]),_v(" tick box and enter your justification for the disagreement, and click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(".")]),_v(" "),_c('li',[_v("If you are fine with the team's changes, click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(" without any other changes upon which the issue will move to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issue Responded")]),_v(" section.")])])]),_v(" "),_c('li',[_v("No action is required for the bugs the team accepted "),_c('em',[_v("exactly as you reported them")]),_v(" (i.e., no change to type or severity). They are shown in CATcher for your reference only.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1)],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the team rejected my bug report without giving a reason?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You can disagree with the rejection, and the teaching team will likely rule in your favor in the next phase.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Can I add more information about the bug when I object to a dev team's response?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Yes, you may. Given that the dev team did not get to see this addition info when they triaged the bug, the weight such additional info add to your case is lower than if you had that info in the initial bug report. Nevertheless, it can still help your cause, especially if the dev team should have thought about that info on their own, even if they were missing in the initial bug report.")])]),_v(" "),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-4-tutor-moderation"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 4: Tutor Moderation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-4-tutor-moderation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")])],1)])],1),_c('p')]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("6")])],1)],1),_v(" "),_m(31),_v(" "),_m(32),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600","onclick":"event.stopPropagation()"}})]),_v(" "),_m(33),_v(" "),_c('p'),_v(" "),_c('div')])])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#week-13-mon-nov-11th-project"}},[_v("Week 13 [Mon, Nov 11th] - Project‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-public-release-v1-6"}},[_v(" tP: Public release → v1.6 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-13"}},[_v("Intro to tP Week 13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-fix-pe-d-bugs"}},[_v("1 Fix PE-D bugs‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-submit-final-deliverables-tue-nov-12th-14-00"}},[_v("2 Submit final deliverables Tue, Nov 12th 14:00‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-prepare-for-the-practical-exam"}},[_v("3 Prepare for the practical exam‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-ensure-the-code-is-reposense-compatible"}},[_v("4 Ensure the code is RepoSense-compatible‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_v("5 Attend the practical exam Fri, Nov 15th 1600-1800‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_v("6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600‎")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(34)])} +with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":""}},[_c('navbar',{attrs:{"placement":"top","type":"dark"},scopedSlots:_u([{key:"brand",fn:function(){return [_c('a',{staticClass:"navbar-brand",attrs:{"href":"/website/index.html","title":"Home"}},[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("CS2103/T "),_c('small',[_v("2024 Aug-Nov")])])])]},proxy:true},{key:"right",fn:function(){return [_c('li',{staticClass:"nav-link"},[_c('form',{staticClass:"navbar-form"},[_c('searchbar',{attrs:{"placeholder":"Search","algolia":"","menu-align-right":""}})],1)])]},proxy:true}])},[_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Schedule")])]},proxy:true}])},[_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/timeline.html"}},[_c('span',[_c('strong',[_v("Full Timeline")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('strong',[_v("Week 1")]),_v(" [Mon, Aug 12th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('strong',[_v("Week 2")]),_v(" [Mon, Aug 19th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Week 3")]),_v(" [Mon, Aug 26th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week4/index.html"}},[_c('span',[_c('strong',[_v("Week 4")]),_v(" [Mon, Sep 2nd] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week5/index.html"}},[_c('span',[_c('strong',[_v("Week 5")]),_v(" [Mon, Sep 9th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week6/index.html"}},[_c('span',[_c('strong',[_v("Week 6")]),_v(" [Mon, Sep 16th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week7/index.html"}},[_c('span',[_c('strong',[_v("Week 7")]),_v(" [Mon, Sep 30th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week8/index.html"}},[_c('span',[_c('strong',[_v("Week 8")]),_v(" [Mon, Oct 7th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week9/index.html"}},[_c('span',[_c('strong',[_v("Week 9")]),_v(" [Mon, Oct 14th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week10/index.html"}},[_c('span',[_c('strong',[_v("Week 10")]),_v(" [Mon, Oct 21st] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week11/index.html"}},[_c('span',[_c('strong',[_v("Week 11")]),_v(" [Mon, Oct 28th] ")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('strong',[_v("Week 12")]),_v(" [Mon, Nov 4th] "),_c('span',{staticClass:"fas fa-arrow-circle-left",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Week 13")]),_v(" [Mon, Nov 11th] ")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/se-book-adapted/index.html"}},[_c('span',[_c('strong',[_v("Textbook")])])])]),_v(" "),_c('li',[_c('a',{staticClass:"nav-link",attrs:{"href":"/website/admin/index.html"}},[_c('span',[_c('strong',[_v("Admin Info")])])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"nav-link",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards","target":"_blank","highlight-on":"none"}},[_c('span',[_c('strong',[_v("Dashboards")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",attrs:{"tags":"m--cs2103 m--cs2113"},scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Project Links")])]},proxy:true}])},[_v(" "),_c('span',[_c('strong',[_v(" Individual Project (iP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Individual Project Info")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" iP Upstream Repo")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/ip-showcase.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" iP Showcase")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/ip-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=java~md~fxml~sh~bat~gradle~txt","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" iP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/ip-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" iP Progress Dashboard")])])]),_v(" "),_c('hr'),_v(" "),_c('span',[_c('strong',[_v(" Team Project (tP):")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tp-overview.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Team Project Info")])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp","target":"_blank"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-code-branch",attrs:{"aria-hidden":"true"}})])]),_v(" tP Upstream Repo (AB3)")])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/teamList.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-list-alt",attrs:{"aria-hidden":"true"}}),_v(" Team List")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-chart-area",attrs:{"aria-hidden":"true"}}),_v(" tP Code Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/tp-progress.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" tP Progress Dashboard")])])])]),_v(" "),_c('dropdown',{staticClass:"nav-link algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('strong',[_v("Other Links")])]},proxy:true}])},[_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Report Bugs")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-comment",attrs:{"aria-hidden":"true"}}),_v(" Forum")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/instructors.html"}},[_c('span',[_c('span',{staticClass:"fas fa-user-tie",attrs:{"aria-hidden":"true"}}),_v(" Instructors")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/announcements","target":"_blank"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-bullhorn",attrs:{"aria-hidden":"true"}}),_v(" Announcements")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://canvas.nus.edu.sg/courses/64945/files","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-file-upload",attrs:{"aria-hidden":"true"}}),_v(" Files (handouts, submissions etc.)")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/admin/tutorials.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-calendar",attrs:{"aria-hidden":"true"}}),_v(" Tutorial Schedule")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-users-cog",attrs:{"aria-hidden":"true"}}),_v(" MS Teams link")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item",attrs:{"href":"/website/git-trail/index.html"}},[_c('span',[_c('span',{staticClass:"fas fa-route",attrs:{"aria-hidden":"true"}}),_v(" Git Learning Trail")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113 m--tic2002"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/java/intermediate.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}}),_v(" Java Coding Standard")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://se-education.org/guides/conventions/git.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fab fa-git-square",attrs:{"aria-hidden":"true"}}),_v(" Git Conventions")])])]),_v(" "),_c('li',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('a',{staticClass:"dropdown-item",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/forum-activities.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Forum Activities Dashboard")])])]),_v(" "),_c('li',[_c('a',{staticClass:"dropdown-item text-success",attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/dashboards/contents/participation.html","target":"_blank"}},[_c('span',[_c('span',{staticClass:"fas fa-trophy",attrs:{"aria-hidden":"true"}}),_v(" Participation Dashboard")])])])])],1)],1),_v(" "),_c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_m(0),_v(" "),_c('p'),_v(" "),_m(1),_v(" "),_m(2),_v(" "),_m(3),_v(" "),_c('div',[_c('div',[_c('div',{staticClass:"border border-success pt-1 ps-2 pb-1 pe-2 border-bottom-0 rounded-top",staticStyle:{"background-color":"#e6fff2"}},[_m(4),_v(" "),_m(5),_v(" "),_c('annotate',{attrs:{"src":"/website/admin/tpGanttChart-iterations.png","width":""}},[_c('a-point',{attrs:{"x":"86%","y":"92%"}},[_c('span',{staticClass:"badge text-danger"},[_c('span',[_c('span',{staticClass:"large"},[_c('span',{staticClass:"large"},[_c('span',{staticClass:"fas fa-person-walking-dashed-line-arrow-right",attrs:{"aria-hidden":"true"}})])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"success","icon-size":"2x","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-arrow-right",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("v1.6")])]),_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Learning outcome")]),_v(": Able to put in final touches while minimizing delivery risks "),_c('span',{staticClass:"dimmed"},[_v("i.e., risks of regressions or deadline overruns")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Product goal")]),_v(": Reach the quality necessary for a public release.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-crosshairs text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Strategy")]),_v(": Freeze features. Strictly limit changes to bug fixes only.")])])])])]),_v(" "),_m(6),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',[_v("Remind yourself of our policy on reuse")]),_v(" (e.g., "),_c('mark',[_v("how to give credit for reused code")]),_v("):")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Policy on reuse "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h3',{attrs:{"id":"policy-on-reuse"}},[_v("Policy on reuse "),_c('small',[_c('small',[_c('span',{staticClass:"badge rounded-pill bg-light text-danger"},[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#policy-on-reuse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('p',[_c('strong',[_v("Scope:")]),_v(" The policies on reuse apply to all project deliverables that are normally expected to be your own work (i.e., code, code comments, documentation, diagrams, images, etc.) unless stated otherwise.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse is encouraged. However, note that reuse has its own costs")]),_v(" (such as the learning curve, additional complexity, usage restrictions, and unknown bugs). Furthermore, you will not be given credit for work done by others. Rather, you will be given credit for "),_c('em',[_v("reusing")]),_v(" work done by others.")]),_v(" "),_c('ul',[_c('li',[_v("You are allowed to reuse work from your classmates or past students, subject to following conditions:\n"),_c('ul',[_c('li',[_v("The work has been shared publicly by us or the authors.")]),_v(" "),_c('li',[_v("You clearly give credit to the original author(s).")])])]),_v(" "),_c('li',[_v("You are allowed to reuse code from external sources, subject to following conditions:\n"),_c('ul',[_c('li',[_v("You clearly give credit to the original author/source.")]),_v(" "),_c('li',[_v("You do not violate the license under which the work has been released. Please "),_c('strong',[_v("do not use 3rd-party images/audio")]),_v(" in your software unless they have been specifically released to be used freely. Just because you found it in the Internet does not mean it is free for reuse.")])])]),_v(" "),_c('li',[_c('mark',[_v("Always get permission from us before you reuse")]),_v(" third-party libraries. Please post your 'request to use 3rd party library' in our "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". That way, the whole class get to see what libraries are being used by others.\n"),_c('ul',[_c('li',[_v("Our approval is given based on compliance with the course. Compliance with the license of the reused software is entirely your responsibility. While we don't anticipate such a case, any liability from improper reuse of a third-party library is to be borne by the person who reused it (i.e., not NUS).")]),_v(" "),_c('li',[_v("Once a 3rd party library has been approved for one student/team, it can be used freely by others without asking for approval again.")])])])]),_v(" "),_c('div',{attrs:{"id":"cite-reuse-immediately"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Keep track of code reuse")]),_v(" If you reuse/adapt code from elsewhere, cite the source in code immediately. Otherwise you will not remember the source of code reuse later. Not citing the original source can land you in trouble for plagiarism.")])])],1),_v(" "),_c('div',{attrs:{"id":"using-tool-generated-code"}},[_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_c('strong',[_v("FAQ: Can I use code generated by AI tools")]),_v(" (e.g., Copilot, ChatGPT)?")]),_c('br'),_v(" "),_c('strong',[_v("Answer:")]),_v(" We don't explicitly prohibit you from using those tools, but we strongly discourage you from using them in a way that hinders your learning. For example,")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Use a tool such as GitHub co-pilot to increase the productivity of writing code (e.g., auto-complete the next bit of code).")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" Write the required code yourself, and then, use the tool to generate alternative implementations, compare, and use that experience to improve your own coding skills.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])]),_v(" When troubleshooting/debugging, use a tool to help you locate the problem.")]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])]),_v(" Give the problem description to the tool and get it to generate the code for you, and use it directly in your submission, and claim it as your own.")])]),_v(" "),_c('p',[_v("Other caveats:")]),_v(" "),_c('ul',[_c('li',[_v("Using such tools can result in your code being same as others in the class. If such code was flagged for plagiarism, \"It was generated by a tool\" will not be a valid excuse. Therefore, if you use (possibly with minor changes) a non-trivial code snippet generated by a tool (e.g., an entire method), it is safer to acknowledge in the code as a case of code reuse.")]),_v(" "),_c('li',[_v("Those tools sometimes can confidently give you the wrong answer. So, have a healthy level of scepticism about the accuracy of the code generated by such tools.")])])])],1),_v(" "),_c('box',{attrs:{"type":"important","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-exclamation",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Automated plagiarism checks ahead!")]),_v(" We'll be using automated plagiarism checks to detect uncredited reuses of content from other CS2103 tP's i.e., tP's done by other teams in this batch and "),_c('mark',[_c('em',[_v("all")]),_v(" previous batches")]),_v(". These checks will be done "),_c('em',[_v("after")]),_v(" the final submissions. The cases detected will be verified and reported to the university administration for disciplinary action. As you know, NUS enforces a penalty of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("F")]),_v(" grade for the entire course (with no option to S/U or withdraw from the course) for plagiarism offenses.")])]),_v(" "),_c('box',[_c('h4',{attrs:{"id":"giving-credit-for-reused-work"}},[_v("Giving credit for reused work"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#giving-credit-for-reused-work","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Given below are how to give credit for things you reuse from elsewhere. These requirements are specific to this course "),_c('span',{staticClass:"dimmed"},[_v("i.e., not applicable outside the course (outside the course, you should follow the rules specified by your employer and the license of the reused work)")])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("used a third party library")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Individual project (iP): Mention in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README")]),_v(" file (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Team project (tP):\n"),_c('ul',[_c('li',[_v("Mention in the Developer Guide (under the "),_c('em',[_v("Acknowledgements")]),_v(" section)")]),_v(" "),_c('li',[_v("Mention in "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-ppp"}},[_v("Project Portfolio Page")]),_v(" if the library has a significant relevance to the features you implemented.")],1)])])]),_v(" "),_c('p',[_v("If you "),_c('strong',[_v("reused code snippets found on the Internet")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. from StackOverflow answers")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred code in another software")]),_v(" or"),_c('br'),_v(" "),_c('strong',[_v("referred project code by current/past student")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If you read the code to understand the approach and implemented it yourself, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("inspired")]),_v(" by https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted code from elsewhere but modified it significantly, mention it as a comment"),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//Solution below "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("adapted")]),_v(" from https://stackoverflow.com/a/16252290")])]),_v("\n")]),_c('span',[_v("{Your implementation of the reused solution here ...}\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_v("If you copy-pasted a non-trivial code block (possibly with minor modifications "),_c('span',{staticClass:"dimmed"},[_v("renaming, layout changes, changes to comments, etc.")]),_v("), also mark the code block as reused code (using "),_c('trigger',{attrs:{"trigger":"click","for":"modal:reusePolicy-authorTags"}},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(" with the "),_c('mark',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-reused")])]),_v(" suffix)"),_c('br'),_v("\nFormat:"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" {yourGithubUsername}-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//{Info about the source...}")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v("{"),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_v("Reused "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("code")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(possibly with minor modifications)")]),_v(" here ...}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}}),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])])]),_v("\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Example of reusing a code snippet (with minor modifications):"),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_v("persons = getList()\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")]),_v(" johndoe-reused")])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Reused from https://stackoverflow.com/a/34646172")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// with minor modifications")]),_v("\n")]),_c('span',[_v("Collections.sort(persons, "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("new")]),_v(" Comparator() {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-meta"}},[_v("@Override")]),_v("\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("int")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("compare")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(CustomData lhs, CustomData rhs)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" lhs.customInt > rhs.customInt ? -"),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("1")]),_v(" : "),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("0")]),_v(";\n")]),_c('span',[_v(" }\n")]),_c('span',[_v("});\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_c('span',[_v("//"),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("@@author")])])]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" persons;\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])],1)]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('strong',[_v("Giving credit for reused images")]),_v(" (and other media assets): Ideally, the source should be credited where the asset appears. For example, if you reused an image in your GUI, you can credit the source where a screenshot of the GUI showing that image appears first in your user guide. In addition, you can also acknowledge the sources in your GitHub project's landing page (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(")")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB3 code")]),_v(": If your team project code follows a design similar to AB3, that doesn't mean you need to credit AB3 -- this is because a brownfield project is "),_c('em',[_v("expected")]),_v(" to follow existing code/design where possible, in the interest of consistency. This type of reuse need not be acknowledged/credited specifically.")]),_v(" "),_c('p',[_c('strong',[_v("Giving credit to AB4 code")]),_v(": If you reused any code from "),_c('a',{attrs:{"href":"https://github.com/se-edu/addressbook-level4/"}},[_v("AB4")]),_v(", cite it as you would cite reuse from any other external source.")])]),_v(" "),_c('p',[_c('strong',[_v("Giving credit for reusing from course materials")]),_v(" (e.g., course textbook, tutorials, instructional resources from se-education.org) is not required, although you are welcome to do so. Reason: Those materials were created by the teaching team for you to use/reuse.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse within the team")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing code written by a team member)")]),_v(" need not be mentioned explicitly. However, you should factor in such reuse when you estimate effort contributed by each team member.")]),_v(" "),_c('p',[_c('strong',[_v("Reuse of documentation")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., reusing a UG/DG section)")]),_v(" is no different from code reuse. Such reuse should be credited as well.")]),_v(" "),_c('p',[_c('strong',[_v("Citing the use of AI-generated/assisted work")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using GitHub Copilot for project work)")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("If the use of the tool was localized into a few places "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it to write a few methods/classes only)")]),_v(", cite its use in comments near where you used it.")]),_v(" "),_c('li',[_v("If the use was more widespread "),_c('span',{staticClass:"dimmed"},[_v("(e.g., used it as an auto-complete tool during most of your coding)")]),_v(", cite the usage (i.e., which tool, who used it, the extent of use) in the following location instead (i.e., no need to cite in code comments):\n"),_c('ul',[_c('li',[_v("iP: in the README file")]),_v(" "),_c('li',[_v("tP: in the DG, under the Acknowledgements section")])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-authorTags"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project mid-v1.3 (extract) →")]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:reusePolicy-ppp"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Project → Deliverables → Project Portfolio Page")]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:deliverablesPPP-teamTasks"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Team-Based Tasks")]},proxy:true}])},[_v(" "),_c('div',[_c('box',[_c('p',[_c('em',[_v("Team-tasks")]),_v(" are the tasks that "),_c('em',[_v("someone")]),_v(" in the team has to do.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Examples of team-tasks")])]},proxy:true}])},[_v(" "),_c('span',{attrs:{"id":"example-team-tasks"}},[_c('p',[_v("Here is a non-exhaustive list of team-tasks:")]),_v(" "),_c('ol',[_c('li',[_v("Setting up the GitHub team org/repo")]),_v(" "),_c('li',[_v("Necessary general code enhancements e.g.,\n"),_c('ol',[_c('li',[_v("Work related to renaming the product")]),_v(" "),_c('li',[_v("Work related to changing the product icon")])])]),_v(" "),_c('li',[_v("Setting up tools e.g., GitHub, Gradle")]),_v(" "),_c('li',[_v("Maintaining the issue tracker")]),_v(" "),_c('li',[_v("Release management")]),_v(" "),_c('li',[_v("Updating user/developer docs that are not specific to a feature "),_c('span',{staticClass:"dimmed"},[_v("e.g. documenting the target user profile")])]),_v(" "),_c('li',[_v("Incorporating more useful tools/libraries/frameworks into the product or the project workflow "),_c('span',{staticClass:"dimmed"},[_v("(e.g. automate more aspects of the project workflow using a GitHub plugin)")])])])])]),_c('p')],1)],1)]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])],1),_c('p')],1)])])],1)])])])],1),_c('p')])],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"1-fix-pe-d-bugs"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("1")])],1)],1),_v(" "),_m(7),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#1-fix-pe-d-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(8),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → "),_c('strong',[_v("After the PE-D")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-d-after-the-session"}},[_c('span',{staticClass:"badge bg-primary"},[_v("PE-D")]),_v(" "),_c('span',{staticClass:"text-primary"},[_v("After the session")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-d-after-the-session","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The relevant bug reports will be transferred to your issue tracker")]),_v(" within a day after the session is over. Once you have received the bug reports for your product, you can decide whether you will act on reported issues before the final submission v1.6. For some issues, the correct decision could be to reject or postpone to a version beyond v1.6."),_c('br'),_v("\nReminder: There is no penalty for any of the bugs you received in the PE-D.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('box',{attrs:{"type":"info","seamless":""},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-angry",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('p',[_c('strong',{staticClass:"text-info"},[_c('strong',[_v("Dealing with \"What the h___ the tester was thinking?\" type bug reports")])])]),_v(" "),_c('p',[_v("Some bug reports will make you angry because they seem baseless, wrong, rude etc. It's still possible to get value from such bug reports though:")]),_v(" "),_c('ul',[_c('li',[_v("After you got over the initial indignation, dig deeper to see if there's even the slightest possibility that there is a bug. For example, consider this scenario:\n"),_c('ol',[_c('li',[_v("The tester claims a certain command doesn't work.")]),_v(" "),_c('li',[_v("All your team members tried the exact same command and it works as advertised. What the h___ the tester is trying to pull here?")]),_v(" "),_c('li',[_v("In reality, the error is actually caused by a duplicate entry in the database resulting from a previous command; the tester didn't mention that command in the bug report (because s/he didn't realize the two are connected).")])])]),_v(" "),_c('li',[_v("The reported bug might be non-existent but the tester's screw up can indicate other areas to improve. For example, the tester reports a missing feature that is clearly mentioned as 'not implemented' in the UG, but perhaps the UG can be improved to make that fact harder to miss?")]),_v(" "),_c('li',[_v("What exactly about the bug report that makes you angry? Remind yourself not to do the same offence when you report bugs yourself in the future.")])]),_v(" "),_c('p',[_v("Use the pain of dealing with this kind of bug reports as an opportunity to develop the following mindset:")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(a)")]),_c('div',[_c('p',[_c('strong',[_v("The product is "),_c('em',[_v("guilty until proven innocent")])]),_v(": If the bug report has even a "),_c('em',[_v("hint")]),_v(" of something amiss with the product, it's your (not the tester's) responsibility to try and prove if it is really a problem or not. Why? because finding a bug is a win for "),_c('em',[_v("you")]),_v(" -- as you can then fix it and thereby avoid the embarrassment of releasing a buggy product.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(b)")]),_c('div',[_c('p',[_c('strong',[_v("A crappy bug report is better than no bug report")]),_v(": If the bug actually exists, it is better to have "),_c('em',[_v("some")]),_v(" indication about it than none at all. In a real project, a tester that fails to find bugs can cause more harm to your career than a tester who finds bugs but doesn't report them well.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fw-bold",staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("(c)")]),_c('div',[_c('p',[_c('strong',[_v("I "),_c('em',[_v("used")]),_v(" to get angry at bug reports, but not anymore")]),_v(": If you work hard, take pride in the quality of your work, it's no wonder that you get angry when others find faults with your work incorrectly. Aim to move past that phase where you take bug reports personally. The sooner you can tackle any sh*tty bug report calmly and objectively, the sooner you'll rise to the 'professional' software engineer level.")])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you have received stray bug reports")]),_v(" (i.e., bug reports that don't seem to be about your project), do let us know ASAP (email the prof).")]),_v(" "),_c('li',[_c('strong',[_v("You can navigate to the original bug report")]),_v(" (via the back-link provided in the bug report given to you) and post in that issue thread to communicate with the tester who reported the bug "),_c('span',{staticClass:"dimmed"},[_v("e.g. to ask for more info")]),_v(", etc. However, the tester is not obliged to respond. Note that simply replying to the bug report in your own repo will not notify the tester.\n"),_c('ul',[_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Do not argue with the tester to try to convince that person that your way is correct/better. If at all, you can gently explain the rationale for the current behavior but do not waste time getting involved in long arguments. If you think the suggestion/bug is unreasonable, just thank the tester for their view and discontinue to discussion.")])])]),_v(" "),_c('li',[_c('strong',[_v("Aim to "),_c('mark',[_v("do a systematic triaging of issues received")])]),_v(". Some suggestions:\n"),_c('ul',[_c('li',[_v("Close duplicate issues.")]),_v(" "),_c('li',[_v("Use labels (create new labels if necessary) to,\n"),_c('ul',[_c('li',[_v("differentiate "),_c('em',[_v("bugs")]),_v(" from the rest (e.g., feature suggestions/flaws).")]),_v(" "),_c('li',[_v("indicate priority of the bugs that need fixing.")])])]),_v(" "),_c('li',[_v("Assign each bug to the person who should fix it.")])])]),_v(" "),_c('li',[_c('strong',[_v("You may ignore "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type/severity.*")]),_v(" labels given by the tester.")]),_v(" They will not affect you or the tester either way -- they were there just for the testers to practice. You may apply your own type/severity labels if you wish."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" In particular, beware of simply following the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" given by the tester; it is your job to decide the correct type of the issue. e.g., What the tester labeled as a "),_c('em',[_v("bug")]),_v(" might actually be a "),_c('em',[_v("feature flaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report is simply a feature suggestion")]),_v(", you can take note of it and close it (to reduce clutter in the issue tracker, and to make it easy for the teaching team to track your progress on dealing with PE-D issues). Similarly, you can close PE-D issues not relevant to v1.6.")])]),_v(" "),_c('box',{attrs:{"type":"wrong","seamless":""}},[_c('p',[_c('strong',[_v("Note that listing bugs as 'known bugs' in the UG or specifying "),_c('em',[_v("unreasonable")]),_v(" constraints in the UG to make bugs 'out of scope' will not exempt those bugs from the final grading.")]),_v(" That is, PE testers can still earn credit for reporting those bugs and you will still be penalized for them."),_c('br'),_v("\nHowever, a product is allowed to have 'known limitations' "),_c('span',{staticClass:"dimmed"},[_v("(e.g., a daily expense tracking application meant for students is unable to handle expenses larger than $999)")]),_v(" as long as they don't degrade the product's use within the intended scope. They will not be penalized.")])]),_v(" "),_c('box',{attrs:{"type":"info","tags":"m--cs2103","seamless":""}},[_c('p',[_c('strong',[_v("Even bugs inherited from AB3 need to be fixed.")]),_v(" As mentioned in a previous week, even bugs you inherited from AB3 need fixing "),_c('span',{staticClass:"dimmed"},[_v("(because \"we inherited it from the previous dev team\" is not a valid excuse to leave a bug unfixed)")]),_v(". If you are unsure if something is such a bug that need fixing, please post in the forum.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',[_v("Identify bugs you missed in the PE-D:")]),_v(" Visit the issue tracker of the team you tested and see bugs reported by others who tested the same product. Identify bugs you missed (if any). That knowledge might help you find similar bugs in your own product as well as find more bugs during the PE.")])])],1)])],1),_c('p'),_v(" "),_m(9),_v(" "),_c('div',[_c('box',{attrs:{"type":"warning","seamless":""}},[_c('p',[_c('strong',[_v("The goal of freezing features in the pre-release iteration")]),_v(" is to subject the features to at least one round of intensive non-dev testing before they are released to the users. In other words, avoiding behavior changes unless they are strictly necessary, so that we minimize the possibility of introducing more bugs."),_c('br'),_v("\nIn a real project, minor or critical changes might be allowed even near a deadline -- but here, we do not allow "),_c('em',[_v("any")]),_v(" feature changes because it can start us on a slippery slope and many \"is this change allowed?\" queries. Therefore, "),_c('span',{staticClass:"text-danger"},[_v("v1.6 should not have "),_c('em',[_v("any")]),_v(" behaviors that were not already tested in the "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("PE Dry run")]},proxy:true}])},[_v("PE-D")])],1),_v("). Hence, the feature freeze "),_c('mark',[_v("comes into effect at the point you released the JAR file that was used for the PE-D")]),_v(".")]),_v(" "),_c('p',[_v("While the info below provides you what to do and what not to do in v1.6 specific cases, the important thing is to understand and "),_c('mark',[_c('strong',[_v("follow the spirit of the "),_c('em',[_v("feature freeze")])]),_v(" (i.e., do not change features further; correct unintentional errors only)")]),_v(".")]),_v(" "),_c('p',[_c('strong',{staticClass:"text-success"},[_v("Allowed in the v1.6 milestone:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("fixing bugs (but not "),_c('em',[_v("feature flaws")]),_v(") -- we use a very restrictive definition of 'bugs' for the feature freeze; to avoid violating the feature freeze unintentionally, be sure to check the FAQs below before you do any fixes/tweaks.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving documentation "),_c('span',{staticClass:"dimmed"},[_v("(e.g., update UG, DG, code comments)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving code quality")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("improving the testing aspect "),_c('span',{staticClass:"dimmed"},[_v("(e.g., add more tests)")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("removing features "),_c('span',{staticClass:"dimmed"},[_v("(i.e., removing an entire feature or a part of a feature)")])])])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Not allowed in v1.6:")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("adding/changing features (even minor behavior enhancements/tweaks)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("any UI enhancements (even purely cosmetic enhancements e.g., alignments, style changes are not allowed)")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("updates to the contents of data files bundled with the JAR file (as they control the behavior of the app)")])])]),_v(" "),_c('p',[_c('strong',[_v("Using 'Planned Enhancements' DG section to counter known feature flaws:")]),_v(" Given you are not allowed to fix feature flaws in v1.6, we allow you to optionally add a section named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Appendix: Planned Enhancements")]),_v(" to the end of the DG. More details in the panel below:")]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → DG (extract): Planned Enhancements "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1)])],1),_c('p'),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("FAQs on what is allowed during the feature freeze:")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q0]")]),_v(" What's the "),_c('mark',[_v("penalty for violating the feature freeze")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" This will be case by case (depending on the severity), but an indicative/minimum penalty is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-1")]),_v(" per member, per violation. i.e., if there is only one violation that is not severe, each member will lose 1 mark.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q1]")]),_v(" How to differentiate between "),_c('strong',[_v("bugs vs enhancements")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" A bug in this context is when the actual behavior differs from the "),_c('em',[_v("advertised")]),_v(" behavior (i.e., the behavior stated in the UG) "),_c('span',{staticClass:"text-danger"},[_v("due to an "),_c('em',[_v("error")]),_v(" in the code")]),_v("."),_c('br'),_v("\nIt will be considered a feature change (i.e., not allowed to do) if,")]),_v(" "),_c('ul',[_c('li',[_v("the current behavior is not strictly 'incorrect' but 'can be better'.")]),_v(" "),_c('li',[_v("the current behavior inconveniences the user but there is a way to work around it.")]),_v(" "),_c('li',[_v("the advertised behavior was not actually implemented (or only partially implemented) in the JAR used for the PE-D.")])]),_v(" "),_c('p',[_v("If the current behavior differs from the UG but the current behavior is not strictly incorrect, update the UG to match the current behavior (in the interest of minimizing code changes). However, an exception can be made if the behavior in the UG (but is not working in the app) was already implemented in v1.5 (i.e., there is code that is specifically written for the behavior in concern) but it is not working due to a bug in that specific code. When fixing such a case, clearly describe in the PR description where the existing implementation is (you can point to a commit, a code segment, or a past PR) and why it wasn't working.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q2]")]),_v(" Will we be "),_c('strong',[_v("penalized for feature flaws not fixed")]),_v(" during the feature freeze?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Product design is hard, and achieving a very good design takes experience, skill, and multiple iterative refinements. Hence, having some feature flaws at this stage is natural. Accordingly, feature flaws will not be penalized in the following cases:")]),_v(" "),_c('ul',[_c('li',[_v("If the feature flaw will be fixed by an item you listed in the "),_c('em',[_v("Planned enhancements")]),_v(" DG section (as mentioned above).")]),_v(" "),_c('li',[_v("After the feature flaw is reported during the PE, you successfully argued it as 'not in scope' (i.e., fixing that flaw is of lower priority than the work done already, and hence it is justifiable to be postponed to a future version). Reporters of such bugs will earn partial credit.")])]),_v(" "),_c('p',[_v("In addition, you can mitigate the impact of feature flaws and thus lower its severity by tweaking the UG (e.g., explain the feature better, clearly state the limitations and guide users to work around those limitations)")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q3]")]),_v(" What if an issue is related to a "),_c('strong',[_v("behavior not specifically stated")]),_v(" in the UG?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In that case, we go by the reasonable 'correct' behavior that one expects. For example, the UG might not specify what happens if a user typed an extra space after the first keyword of the command (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE]1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("mark[SPACE][SPACE]1")]),_v(") in which case the reasonable correct behavior is to ignore the extra space.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q4]")]),_v(" What if a "),_c('strong',[_v("feature is mentioned in the UG but not available")]),_v(" fully in the product?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Describing a feature in the UG without implementing it is a UG bug. The remedy is to remove the feature from the UG."),_c('br'),_v("\nIf the behavior difference is because some parts of the feature is not implemented yet, the feature is incomplete (i.e., not a bug). The remedy is to remove the feature (if it is not usable in the current form) or update the UG to match the current version of the feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q5]")]),_v(" Can we "),_c('strong',[_v("tweak validity checks")]),_v(" for a user input, or error/exception handling?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Can be allowed only if the current behavior causes the software to "),_c('em',[_v("misbehave")])]),_v(" (i.e., crash, give "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the result given by the app differs from the result that matches the user input")]},proxy:true}])},[_v("incorrect results")]),_v(", store "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same data item is stored as different values in multiple places, or the value stored by the app is different from the one given by the user")]},proxy:true}])},[_v("inconsistent data")]),_v(", or make it unusable for typical users).")],1),_v(" "),_c('li',[_c('strong',[_v("Accepting seemingly 'unsuitable' values")]),_v(" for an input (e.g., accepting numbers for a person name, empty value as a parameter):"),_c('br'),_v("\nThis is not considered 'incorrect' (giving more freedom to the user is not necessarily incorrect) unless those unsuitable values causes the application to misbehave.")]),_v(" "),_c('li',[_c('strong',[_v("Accepting supposedly invalid values")]),_v(" (e.g., end date is earlier than start date; February 30th) is, while not ideal, not necessarily incorrect either (i.e., adopting a "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Garbage_in,_garbage_out"}},[_v("garbage-in garbage-out")]),_v(" approach to input validation). However, if such data can make other things go haywire (e.g., crash the app, corrupt the data file), accepting them can be considered a bug, and fixed.")]),_v(" "),_c('li',[_c('strong',[_v("Rejecting valid inputs")]),_v(" is a bug and can be fixed, unless such data is not expected to be used (in normal usage), or if a reasonable workaround exists (e.g., not accepting "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name is a problem but until it is supported, users can be asked to use a workaround such as using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s o")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("son of")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Validity checks on edits to the data file")]),_v(":"),_c('br'),_v("\nAs per AB3 UG (which states the current level of support for editing the data file manually), only valid edits will be supported. If the file is invalid, the app will start with an empty file (not crash). You may rectify only if the current level of support doesn't meet that bar. Furthermore, you may state in the UG that certain incorrect edits to the datafile can result in unexpected behaviors, and caution users to edit the file only if they know what they are doing.")]),_v(" "),_c('li',[_c('strong',[_v("Handling extraneous inputs")]),_v(" (e.g., extra parameters, repeated parameters etc.) in commands:"),_c('br'),_v("\nThe command 'forgiving' these extraneous inputs (i.e., giving an output same as or similar to if those inputs are not present) is not incorrect. You can mention in the UG that such inputs will be ignored. AB3 already does a similar thing for some commands. Any special handling of such inputs can be left as a future enhancement.")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q6]")]),_v(" Can we "),_c('strong',[_v("tweak UI text")]),_v(" (i.e., error/help messages or other text shown to the user)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the current text is incorrect (i.e., a bug). Adding more information or otherwise 'enhancing' the text is not allowed. Other points to note,")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Spelling errors and grammar errors")]),_v(" in the UI (or docs) can be fixed, as they are errors by definition.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Outdated AB3 terms")]),_v(" (e.g., 'addressbook', 'person') can be updated to a term that matches your application. This applies to the data file name as well.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("If a user action "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., does not perform the action user requested but does not also give any indication that the action was not performed")]},proxy:true}])},[_v("fails silently")])],1),_v(", it can be fixed to inform the user of the problem.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Widening the scope of a message (or making it more general)")]),_v(" is allowed. For example, suppose an error can be caused by a problem in parameters x, y, or z but the error message says "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y")]),_v(". In this case the current error message is incomplete and hence you may widen its scope (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in x or y or z")]),_v(") or make it more general (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("problem in parameters")]),_v(").")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Making user-facing info more specific/informative")]),_v(" (e.g., changing a generic error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Command format is invalid")]),_v(" into a more specific error message "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The parameter p/ in the command is not valid")]),_v(") is an enhancement i.e., not allowed.")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-times text-danger",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_c('strong',[_v("Merely standardizing text")]),_v(" (e.g., to use the same term everywhere) is an enhancement i.e., not allowed.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q7]")]),_v(" Can we "),_c('strong',[_v("tweak case-sensitivity")]),_v(" of a feature?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" If the case-sensitivity of a feature does not follow the real world, it is considered a feature flaw (i.e, the design of the feature is not optimal). The best you can do in v1.6 is to document this behavior clearly in the UG."),_c('br'),_v("\nAn exception is when the UG clearly states the case sensitivity but the actual feature implementation doesn't follow it, in which case it is a bug and can be fixed.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q8]")]),_v(" A UI "),_c('strong',[_v("text gets truncated (or overflows)")]),_v(" for certain inputs (or certain Windows sizes); can we fix them?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Only if the behavior hinders normal usage i.e., the user not being able to see the full text in "),_c('em',[_v("any way")]),_v(" can be considered an 'incorrect' behavior, and hence, a bug. If the user is able to see the full text by resizing the Window or using another view provided by the app, it is not a bug."),_c('br'),_v("\nAlso, accommodating 'extreme' inputs (e.g., a person name with 1000 characters, an index that exceeds the range of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("int")]),_v(") can be considered a nice-to-have feature, to be added in a future version (i.e., lack of it is not a bug).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q9]")]),_v(" Can we "),_c('strong',[_v("tweak the command format")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No, as this would be considered changing the design of a feature.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q10]")]),_v(" What if the "),_c('strong',[_v("UI is inconsistent with the data")]),_v("?")])]},proxy:true}])},[_v(" "),_c('p',[_v("e.g., the UI continues to show an item after it was deleted in the most recent command")]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" Yes, this can be fixed as the UI is showing 'incorrect' data."),_c('br'),_v("\nAlternatively, UI not auto-updating immediately after a command executes can be considered a separate feature that the current version of the app doesn't have yet. In that case, make it clear in the UG and also inform users how to update the UI "),_c('span',{staticClass:"dimmed"},[_v("(e.g., by running another command)")]),_v(".")]),_v(" "),_c('p',[_c('strong',[_v("[Q10a]")]),_v(" What if after a command is executed the UI doesn't switch to the intended view, or switch to a view not intended?"),_c('br'),_v(" "),_c('strong',[_v("A:")]),_v(" If there is a way for the user to switch to the target view (e.g., by typing another command or clicking somewhere in the UI), this will be considered a 'can be better' situation (i.e., an enhancement, not allowed to fix).")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q11]")]),_v(" The tester has categorized a PE-D issue as a feature-flaw but we think it is a bug (or vice versa). How to proceed?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" The category chosen by the tester is immaterial. You have to choose the correct category and proceed accordingly. Do not fix feature flaws even if the tester categorized them as bugs.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q12]")]),_v(" We already merged a PR that violates the feature freeze. Now what?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" No penalty if you revert the change for the final submission. You can use "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/reverting-a-pull-request"}},[_v("GitHub's "),_c('em',[_v("Revert PR")]),_v(" feature")]),_v(" for this. Failing that, you'll need to reverse the merge commit of the offending PR manually, or at least do another PR to reverse the effect of the previous feature freeze violation.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q13]")]),_v(" How to decide between recording a feature flaw as a 'known issue' (in the UG) and a 'planned enhancement' (in the DG)?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")])]),_v(" "),_c('ul',[_c('li',[_v("UG's 'Known Issues' is a way to caution users about limitations of the app. In terms of grading, informing users of an issue can reduce the severity of the issue, but they are not totally immune from being reported/penalized as bugs."),_c('br'),_v("\nDG's 'Planned Enhancements' are immune from PE bug reporting. It's mostly for PE purposes (i.e., a course-specific item); not something you see often in real DGs.")]),_v(" "),_c('li',[_v("There is no limit to how many known issues you can list in the UG, but listing many will put the product in a negative light.")]),_v(" "),_c('li',[_v("You can list the same item in both, in which case the presentation/details of it can vary between the two too (as the two documents are meant for two different audiences).")])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimal":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("[Q14]")]),_v(" What if the the current behavior X is reported as a bug in the PE? Will it be considered a bug?")])]},proxy:true}])},[_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" In the PE, the tester and the dev team are expected to attempt to reach a decision before the teaching team's opinion is factored in. Therefore, our policy is not to judge potential PE issues in advance, so as not to preempt the PE process.")])])],1)],1),_v(" "),_m(10),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q1: Performance of PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("In this context, a good bug report,")]),_v(" "),_c('ul',[_c('li',[_v("has a descriptive title,")]),_v(" "),_c('li',[_v("has enough details,")]),_v(" "),_c('li',[_v("severity/type labels chosen are not too far off,")]),_v(" "),_c('li',[_v("is written in a non-confrontational tone, and")]),_v(" "),_c('li',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])]),_v(" "),_c('p',[_v("Rate each tester on the following scale:")]),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Poor")]),_v(" "),_c('th',[_v("Below expectations")]),_v(" "),_c('th',[_v("Meets expectations")]),_v(" "),_c('th',[_v("Exceeds expectations")]),_v(" "),_c('th',[_v("Greatly exceeds expectations")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_v("no bug reports from this tester")]),_v(" "),_c('td',[_v("just a few bug reports, and none are good")]),_v(" "),_c('td',[_v("3-5 good bug reports")]),_v(" "),_c('td',[_v("6-8 good bug reports")]),_v(" "),_c('td',[_v("9 or more good bug reports")])])])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Q2: Rank PE-D testers")])]},proxy:true}])},[_v(" "),_c('p',[_v("Rank the PE-D testers based on their performance (five rank 1 to the top performing tester):")]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester A")]),_v(": rank __"),_c('br'),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Tester B")]),_v(": rank __"),_c('br'),_v("\n...")])]),_c('p')],1),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_v("PE-D bug titles will be prefixed with tester ID e.g., ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE-D][Tester A] UG does not load")]),_v(") to make it easy for you to "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("using GitHub issue tracker's filters/search box")]},proxy:true}])},[_v("filter")]),_v(" bugs reported by each tester."),_c('br'),_v("\nFurthermore, tester ID mapping (i.e., who is Tester A, Tester B, etc.) will be sent to you via email within 1 day after the PE-D.")],1)])]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"2-submit-final-deliverables-tue-nov-12th-14-00"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("2")])],1)],1),_v(" "),_m(11),_v(" "),_m(12),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#2-submit-final-deliverables-tue-nov-12th-14-00","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_m(13),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Penalty for late submission")]),_v(" (per file): "),_c('br'),_v(" "),_c('mark',[_v("-1 mark for missing the deadline (up to 2 hour of delay).")]),_c('br'),_v("\n-2 for an "),_c('em',[_v("extended delay")]),_v(" (up to 24 hours late)."),_c('br'),_v("\nPenalty for delays beyond 24 hours is determined on a case by case basis.\n"),_m(14)]),_v(" "),_m(15),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Follow submission instructions closely")]),_v(". "),_c('mark',[_v("Any non-compliance will be penalized")]),_v(". e.g. wrong file name/format."),_c('br'),_v("\nCanvas might automatically add a file name suffix (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-1.pdf")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*-2.pdf")]),_v(", ...) if you upload a file multiple times. You can safely ignore that suffix.")]),_v(" "),_m(16)]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('big',[_c('strong',[_v("Submissions:")])])],1)]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',{attrs:{"id":"tip-how-to-convert-to-pdf"}},[_c('box',{attrs:{"id":"caution-on-pdf-conversion","type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("Don't take PDF conversion lightly:")]),_v(" "),_c('strong',[_v("To convert the UG/DG into PDF format")]),_v(", go to the generated page in your project's github.io site and use "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("this technique")]),_v(" to save as a pdf file. "),_c('mark',[_v("Using other techniques or not following the settings suggested in the given technique can result in issues")]),_v(" such as missing background colors, poor quality resolution, unnecessarily large files (the last two can be considered as bugs).")]),_v(" "),_c('p',[_c('strong',[_v("The PDF versions of the UG/DG should be "),_c('em',[_v("usable")])]),_v(" by the target readers, even if not as neat/optimized as the Web versions. For example, margins and page breaks need not be optimized, but they should not hinder the reader either. Assume some will occasionally choose the PDF version over the Web version "),_c('span',{staticClass:"dimmed"},[_v("e.g, for printing, offline viewing, annotating etc.")])]),_v(" "),_c('p',[_c('strong',{staticClass:"text-danger"},[_v("PE uses the PDF versions of UG/DG, not the Web version!")]),_v(" Any problems in those PDF files (e.g., broken links, messed up formatting) can be reported as bugs.")]),_v(" "),_c('p',[_c('strong',[_v("Ensure hyperlinks in the pdf files work")]),_v(". "),_c('mark',[_v("Broken/non-working hyperlinks in the PDF files will be considered as bugs")]),_v(". Again, use the conversion technique given above to ensure links in the PDF files work.")]),_v(" "),_c('p',[_c('strong',[_v("PDF files should")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("be paginated")]),_v(" at a reasonable page size (e.g., A4). "),_c('span',{staticClass:"dimmed"},[_v("Reason: single-page PDF files don't work well in some PDF viewers, and not suitable for printing either.")])]),_v(" "),_c('li',[_c('strong',[_v("allow copying text")]),_v(" so that readers can copy text from them "),_c('span',{staticClass:"dimmed"},[_v("(e.g., copy an example command from the UG)")]),_v(".")])]),_v(" "),_c('p',[_c('strong',[_v("Try the PDF conversion early")]),_v(". If you do it at the last minute, you may not have time to fix any problems in the generated PDF files (such problems are more common than you think).")])])],1),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Side benefits for early submissions:")]),_v(" Given that "),_c('em',[_v("using buffers to reduce the risk of deadline overruns")]),_v(" is a learning outcome of this course, we strongly encourage setting an internal submission deadline a few hours earlier than the actual deadline. As an incentive, we plan to perform some checks on early submissions and inform you if we found issues with your submission "),_c('span',{staticClass:"dimmed"},[_v("(e.g., incorrect file name/format)")]),_v(", thus giving you a chance to fix them before the deadline and avoid a penalty for it.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("You may use automated tools to improve documentation:")]),_v(" e.g., tools such as Grammarly may be used to improve the writing quality and find grammar errors.")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("The icon "),_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" indicates team submissions.")]),_v(" Only one person need to submit on behalf of the team but we recommend that others help verify the submission is in order."),_c('br'),_v(" "),_c('mark',[_v("We will not entertain requests to limit late penalties of team submissions to one person")]),_v(" even if the delay was one person's fault. That is, the responsibility (and the penalty) for team submissions are to be shared by the whole team rather than burden one person with it.")])])],1),_v(" "),_m(17),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Executable "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should be an executable jar file")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Should be "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v(" i.e., it can be used by end-users")]},proxy:true}])},[_c('em',[_v("releasable")])])],1),_v(". While some features may be scheduled for later versions, the features in v1.6 should be good enough to make it usable by at least some of the target users.")]),_v(" "),_c('li',[_v("Also note the following constraint:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')])])])],1),_c('p'),_v(" "),_m(18),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Source Code "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("Should match v1.6 deliverables")]),_v(" i.e., executable, docs, website, etc.")]),_v(" "),_c('li',[_c('strong',[_v("To be delivered as a Git repo.")]),_v(" Ensure your GitHub team repo is updated to match the executable.")])])])])])],1),_c('p'),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_v("Reminder: double-check to ensure the code attributed to you by RepoSense is correct.")]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Making the Code RepoSense-Compatible "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_c('ul',[_c('li',[_v("Go to the "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tp Code Dashboard")]),_v(". Click on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("")]),_v(" icon against your name and verify that the "),_c('mark',[_v("lines attributed to you (i.e., lines marked as green)")]),_v(" reflects your code contribution correctly. This is important because some aspects of your project grade (e.g., code quality) will be graded based on those lines."),_c('br'),_v(" "),_c('img',{attrs:{"src":"/website/admin/images/greenLines.png","width":"600"}})])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("More info on how to make the code RepoSense compatible:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-2"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-2"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_m(19),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → User Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('box',[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("In UG/DG, using hierarchical section numbering and figure numbering is optional")]),_v(" (reason: it's not easy to do in Markdown), but make sure it does not inconvenience the reader (e.g., use section/figure title and/or hyperlinks to point to the section/figure being referred to). Examples:")]),_v(" "),_c('blockquote',[_c('p',[_v("In the section "),_c('a',{attrs:{"href":""}},[_c('em',[_v("Implementation")])]),_v(" given above ...")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('p',[_c('strong',[_v("CS2103T does not require you to indicate author name of DG/UG sections")]),_v(" (CS2101 requirements may differ). We recommend (but not require) you to ensure that the code dashboard reflect the authorship of doc files accurately.")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/UserGuide.md")]),_v(" file (for ease of tracking by grading scripts).")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Should cover all current features")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Ensure those descriptions match the product precisely")]),_v(", as it will be used by peer testers ("),_c('mark',[_v("inaccuracies will be considered bugs")]),_v(").")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" "),_c('strong',[_v("You can also cover future features")]),_v(". Mark those as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Coming soon")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("It is not necessary for the UG to contain every nitty-gritty detail")]),_v(" about the product behavior. Some rarely needed information can be omitted from the UG, if the user is expected to know that information already or if the user is kept informed in other ways. "),_c('span',{staticClass:"dimmed"},[_v("For example, if a certain invalid input is unlikely to be used anyway, it is fine to not specify it in the UG, as long as the product is able to give an informative error message when that invalid input is used.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Refrain from overusing screenshots")]),_v(". While it is good to have screenshots in the UG, note that they are hard to maintain. For example, if a future version changes the GUI slightly, it will require all your screenshots to be updated. Here are some tips:")]),_v(" "),_c('ul',[_c('li',[_v("In general, don't use more screenshots than necessary.")]),_v(" "),_c('li',[_v("In some cases, you may want to crop the screenshot to show only the elements being discussed. That way, the screenshot doesn't need to be updated when other parts of the GUI is modified in a later version.")]),_v(" "),_c('li',[_v("Don't use a higher resolution than necessary as it can increase the UG file size unnecessarily.")])])]),_v(" "),_c('li',[_c('p',[_v("Also note the following constraint:")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Constraints → Constraint-File-Size "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"constraint-file-size-2"}},[_c('span',{staticClass:"badge bg-warning text-dark text-monospace"},[_c('span',{staticClass:"fas fa-ban",attrs:{"aria-hidden":"true"}}),_v(" Constraint-File-Size")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#constraint-file-size-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('p',[_v("The file sizes of the deliverables should be reasonable and not exceed the limits given below. "),_c('br')]),_v(" "),_c('div',{attrs:{"tags":"m--cs2113 m--cs2103"}},[_c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_v("Reason:")]),_v(" It is hard to download big files during the practical exam due to limited WiFi bandwidth at the venue. Plus, there is no reason to use space/bandwidth without a proportional benefit.")])])]),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Product (i.e., the JAR/ZIP file): 100MB")]),_v(" (Some third-party software -- e.g., Stanford NLP library, certain graphics libraries -- can cause you to exceed this limit)")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"text-danger"},[_v("Documents (i.e., PDF files): 15MB/file")]),_v(" (Not following "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/savingPdf.html"}},[_v("the recommended method of converting to PDF format")]),_v(" can cause big PDF files. Another cause is using unnecessarily high resolution images for screenshots).")])])]),_v(" "),_c('p',[_v("In addition, do "),_c('mark',[_v("ensure that the final JAR/PDF files are not bloated unnecessarily")]),_v(". Such "),_c('span',{staticClass:"text-danger"},[_v("bloat can be reported as a bug")]),_v(".\nSome suggestions:")]),_v(" "),_c('ul',[_c('li',[_v("Check if the the assets (e.g., images, audio, data) included in the JAR files are all strictly necessary and the quality is not unnecessarily high (e.g., images with higher resolution than necessary).")]),_v(" "),_c('li',[_v("Check if the third-party libraries in the JAR file are strictly necessary or whether they have lighter versions that are still enough for your purpose.")]),_v(" "),_c('li',[_v("Using "),_c('a',{attrs:{"href":"http://tutorials.jenkov.com/javafx/webview.html"}},[_v("JavaFX WebView")]),_v(" allows you to display a Web page within your application but it adds about 70MB to your JAR file. If you decide to use that library, ensure the benefit is worth the increase in size.")])])])])])],1),_c('p')],1)])])],1),_c('p'),_v(" "),_m(20),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Developer Guide "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("How detailed the DG should be? Do we have to describe every feature/component?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("The DG is primarily meant to help current/future developers. In general, the DG is expected to provide minimal yet sufficient guidance for developers, serving them in the following ways:")]),_v(" "),_c('ul',[_c('li',[_v("It act as a starting point for developers, before they can dive into the code itself "),_c('span',{staticClass:"dimmed"},[_v("e.g., by providing an architecture-level overview of the system")])]),_v(" "),_c('li',[_v("It provides a roadmap to developers "),_c('span',{staticClass:"dimmed"},[_v("e.g., pointing out where important information can be found in the code")])]),_v(" "),_c('li',[_v("It complements the code, providing info/perspectives not specified in the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., rationale for high-level design choices, details of dev ops)")]),_c('br'),_v("\nor not easy to grasp from the code "),_c('span',{staticClass:"dimmed"},[_v("(e.g., architecture level view, visual models)")]),_v(".")])]),_v(" "),_c('p',[_v("Therefore, decide based on how the inclusion/exclusion affects that target audience (you belong to the target audience too!) in achieving the above objectives.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("The main content you add should be in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/DeveloperGuide.md")]),_v(" file (for ease of tracking by grading scripts)."),_c('br'),_v("\nIf you use PlantUML diagrams, commit the diagrams as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(".puml")]),_v(" files in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/diagrams")]),_v(" folder.")]),_v(" "),_c('li',[_c('strong',[_v("Should match the latest release of the product")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Ensure the 'Acknowledgements' section is accurate")]),_v(": It should cite all ideas/code/documentation you reused. If you reused/adapted or even drew inspiration from other projects (including projects by past/current students), mention the extent of reuse and give hyperlinks to the original projects' GitHub page, UG, DG, etc. Examples:\n"),_c('ul',[_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Foo was inspired by a similar feature of the past project "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" ("),_c('a',{attrs:{"href":""}},[_v("UG")]),_v(", "),_c('a',{attrs:{"href":""}},[_v("DG")]),_v("), although our implementation is entirely new.")])]),_v(" "),_c('li',[_c('span',{staticClass:"dimmed"},[_v("The feature Bar (including the code) was reused with minimal changes from the same "),_c('a',{attrs:{"href":""}},[_v("TaskPro")]),_v(" project.")])])])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" You can include proposed implementations of future features.")])]),_v(" "),_c('li',[_c('strong',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Include an appendix named "),_c('em',[_v("Instructions for Manual Testing")])]),_v(", to give some guidance to the tester to chart a path through the features, and provide some important test inputs the tester can copy-paste into the app.\n"),_c('ul',[_c('li',[_c('strong',[_v("Cover all user-testable features")]),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" but no need to cover existing AB3 features if you did not touch them")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("No need to give a long list of test cases")]),_v(" including all possible variations. It is upto the tester to come up with those variations.")]),_v(" "),_c('li',[_v("Information in this appendix should "),_c('em',[_v("complement")]),_v(" the UG. "),_c('mark',[_v("Minimize repeating information that are already mentioned in the UG.")])]),_v(" "),_c('li',[_c('strong',[_v("Inaccurate instructions will be considered bugs")]),_v(".")])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Appendix: Effort")])]),_v(" that evaluators can use to estimate the total project effort.\n"),_c('ul',[_c('li',[_v("Keep it brief (~1 page)")]),_v(" "),_c('li',[_v("Explain the difficulty level, challenges faced, effort required, and achievements of the project.")]),_v(" "),_c('li',[_v("If a significant part (e.g., more than 5%) of the effort was saved through reuse, mention what you reused and how it affected the effort "),_c('span',{staticClass:"dimmed"},[_v("e.g., the feature X is implemented using library Foo -- our work on adapting Foo to our product is contained in class "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FooAdapter.java")])]),_v(".")]),_v(" "),_c('li',[_v("Use AB3 as a reference point "),_c('span',{staticClass:"dimmed"},[_v("e.g., you can explain that while AB3 deals with only one entity type, your project was harder because it deals with multiple entity types")]),_v(".")])])])])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103","id":"planned-enhancements-info"}},[_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("We highly recommend adding an appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(", listing fixes you propose to add in the near future, to counter known feature flaws that you are not allowed to fix in v1.6.\n"),_c('ul',[_c('li',[_v("This can be added "),_c('em',[_v("after")]),_v(" the PE-D is over (and PE-D bug reports have been received).")]),_v(" "),_c('li',[_v("This section may contain up to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team_size x 2")]),_v(" enhancements "),_c('span',{staticClass:"dimmed"},[_v("e.g., a 5-person team can have up to 10 enhancements")]),_v(".")]),_v(" "),_c('li',[_v("At the start of the section, clearly state the team size. While this information is not useful for a real DG, it will help PE testers easily see if you have exceeded the allowed planned enhancements count."),_c('br'),_v("\nFor a similar reason, structure this section as a numbered list, each item in the list describing exactly one planned enhancement."),_c('br'),_v("\nEach enhancement should be specific, describing the feature flaw it addresses and how exactly the feature will be changed, providing sample UIs/inputs/outputs if applicable. e.g.,\n"),_c('blockquote',[_c('p',[_c('strong',[_c('strong',[_v("Planned Enhancements")])])]),_v(" "),_c('p',[_v("Team size: 5")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Make 'failed contact deletion' message more specific")]),_v(": The current error message for a failed contact deletion "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Operation failed!")]),_v(" is too general. We plan to make the error message also mention which action failed and the reason for the failure: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("The contact Amy Lee could not be deleted as it is referenced by another contact Ben Chua")]),_v(".")]),_v(" "),_c('li',[_v("...")])])])]),_v(" "),_c('li',[_v("Each enhancement should be a tweak to an existing feature, and should not be a new feature altogether.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug reports matching an item in this section "),_c('mark',[_v("will not be penalized")]),_v(" for the team, and testers will not earn credit for reporting them either. However, testers can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bugs on the enhancements listed in this section, if they think the planned feature tweak itself is flawed/inadequate.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("When listing 'Planned Enhancements' in the DG, if enhancement X and Y are very similar, can we count them as one?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Only if adding one automatically adds the other. If one can be added without the other, they are counted as two enhancements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_v("If the team has exceeded the allowed count in the planned enhancements")]),_v(", only the first N items (where N is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("team size x 2")]),_v(") in that list will have immunity. The rest can be reported as bugs. In addition, exceeding the count can be reported as a separate DG bug.")])])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('strong',[_v("What to do with other dev docs")]),_v(" linked from the DG e.g., "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/SettingUp.html"}},[_c('em',[_v("Setting up and getting started")]),_v(" guide")]),_v("?\n"),_c('ul',[_c('li',[_v("They are not part of the tP deliverables, and are not graded.")]),_v(" "),_c('li',[_v("You are welcome to (but not required to) update them. If you do, the work can be counted as a tP contribution.")]),_v(" "),_c('li',[_v("The normal course of action is to just leave them be. It's fine if they are outdated and doesn't match with your current product anymore.")]),_v(" "),_c('li',[_v("But best not to delete them altogether, as that can result in broken links in your DG page.")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can we remove 'proposed features' sections in the DG?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may remove them, but you are welcome to keep them too (they can be useful if a team member is unable to find any other UML diagram to update).")]),_v(" "),_c('p',[_v("If you keep them in the DG, update them to match the current version of the product. Otherwise, outdated content can be reported as DG bugs.")])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The "),_c('em',[_v("Appendix: Requirements")]),_v(" section")]),_v(" should be updated as follows:\n"),_c('ul',[_c('li',[_v("Requirements implemented in the current version: make sure requirements match the way they are actually been implemented (e.g., use case steps).")]),_v(" "),_c('li',[_v("Requirements yet to be implemented: keep these as well, as this is an ongoing project and these are meant to be implemented in future iterations.")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"dg-tips"}},[_v("DG Tips"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#dg-tips","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"dgTips"}},[_c('ul',[_c('li',[_c('strong',[_v("Aim to showcase your documentation skills.")]),_v(" The primary objective of the DG is to explain the design/implementation to a future developer, but a secondary objective is to serve as evidence of your ability to document deeply-technical content using prose, examples, diagrams, code snippets, etc. appropriately. To that end, you may also describe features that you plan to implement in the future, even beyond v1.6 (hypothetically)."),_c('br'),_v("\nFor an example, see "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html#proposed-undoredo-feature"}},[_v("the description of the undo/redo feature implementation in the AddressBook-Level3 developer guide")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Use multiple UML diagram types.")]),_v(" Following from the point above, try to include UML diagrams of multiple types to showcase your ability to use different UML diagrams.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Is it enough to update existing UML content/diagrams or must we add new content/diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_c('strong',[_v("You are welcome to add new content/diagrams")]),_v(", but it is not a strict requirement. Consider costs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the effort required to add and maintain new content)")]),_v(" vs benefits "),_c('span',{staticClass:"dimmed"},[_v("(how much the new content helps future developers)")]),_v(" and decide accordingly.\n"),_c('strong',[_v("However, everyone is expected to contribute to the DG")]),_v(", which means you should divide the DG-update work among team members.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if the features I added don't affect UML diagrams?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('ul',[_c('li',[_v("We expect all students to have "),_c('em',[_v("some")]),_v(" experience working with DG UML diagrams, to verify that you are able to handle similar diagramming tools in the future.")]),_v(" "),_c('li',[_v("If your code changes don't require updates to existing UML diagrams or adding new diagrams,\n"),_c('ul',[_c('li',[_v("you can document a 'proposed' feature or a design change that you might do in a future iteration, which gives you an opportunity to add some UML diagrams.")]),_v(" "),_c('li',[_v("Also take a closer look at the features you added -- not needing changes to UML might (but not always) be a sign that the features you added didn't go deep enough. In the context of the tP, it is better to add one big feature, rather than add many small insignificant features.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Diagramming tools")]),_v(":\n"),_c('ul',[_c('li',[_v("AB3 uses PlantUML (see the guide "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/plantUml.html"}},[_c('em',[_v("Using PlantUML")]),_v(" @SE-EDU/guides")]),_v(" for more info).")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Instead of PlantUML, can I use some other tool?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Yes, you may use any other tool too (e.g., PowerPoint). But wait; if you do, note the following:")]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Choose a diagramming tool that has some 'source' format that can be version-controlled using git and updated incrementally")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(reason: because diagrams need to evolve with the code that is already being version controlled using git)")]),_v(". For example, if you use PowerPoint to draw diagrams, also commit the source PowerPoint files so that they can be reused when updating diagrams later.")]),_v(" "),_c('li',[_v("Use the same diagramming tool for the whole project, except in cases for which there is a "),_c('em',[_v("strong")]),_v(" need to use a different tool due to a shortcoming in the primary diagramming tool. "),_c('span',{staticClass:"dimmed"},[_v("Do not use a mix of different tools simply based on personal preferences.")])])]),_v(" "),_c('p',[_v("So far, PlantUML seems to be the best fit for the above requirements.")])])])],1),_v(" "),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("Can "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., automatically reverse engineered from the Java code")]},proxy:true}])},[_v("IDE-generated")]),_v(" UML diagrams be used in project submissions?")],1)])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("Not a good idea. Given below are three reasons each of which can be reported by evaluators as 'bugs' in your diagrams, costing you marks:")]),_v(" "),_c('ul',[_c('li',[_v("They often don't follow the standard UML notation (e.g., they add extra icons).")]),_v(" "),_c('li',[_v("They tend to include "),_c('em',[_v("every")]),_v(" little detail whereas we want to limit UML diagrams to important details only, to improve readability.")]),_v(" "),_c('li',[_v("Diagrams reverse-engineered by an IDE might not represent the actual design as some design concepts cannot be deterministically identified from the code "),_c('span',{staticClass:"dimmed"},[_v("e.g., differentiating between multiplicities "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0..1")]),_v(" vs "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1")]),_v(", composition vs aggregation")]),_v(".")])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Keep diagrams simple.")]),_v(" The aim is to make diagrams "),_c('mark',[_c('em',[_v("comprehensible")]),_v(", not necessarily "),_c('em',[_v("comprehensive")])]),_v("."),_c('br'),_v("\nWays to simplify diagrams:\n"),_c('ul',[_c('li',[_c('strong',[_v("Omit less important details")]),_v(". Examples:\n"),_c('ul',[_c('li',[_v("a class diagram can omit minor utility classes, private/unimportant members; some less-important associations can be shown as attributes instead.")]),_v(" "),_c('li',[_v("a sequence diagram can omit less important interactions, self-calls, method parameters, etc."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("...")]),_v(" (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("foo(...)")]),_v(") to indicate parameters have been omitted."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use pseudocode instead of exact method calls e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("save data in file")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("saveData(content, filename)")]),_v("."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Omit intricate details that complicated the diagram unnecessarily they add to the diagram e.g., exception handling ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("throw")]),_v("/"),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("catch")]),_v("), lambdas, calls to anonymous methods, etc."),_c('br'),_v("\nIf you feel they are important to the purpose of the diagram (i.e., omitting them can mislead the reader), you can use a UML note to mention that information (as plain text) in the diagram.")])])]),_v(" "),_c('li',[_c('strong',[_v("Omit repetitive details")]),_v(" e.g., a class diagram can show only a few representative ones in place of many similar classes (note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-logicClassDiagram"}},[_v("AB3 Logic class diagram")]),_v(" shows concrete "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*Command")]),_v(" classes using a placeholder "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("XYZCommand")]),_v(").")],1),_v(" "),_c('li',[_c('strong',[_v("Limit the scope of a diagram.")]),_v(" Decide the purpose of the diagram (i.e., what does it help to explain?) and omit details not related to it."),_c('span',{attrs:{"tags":"m--cs2103"}},[_v(" In particular, avoid showing lower-level details of multiple components in the same diagram unless strictly necessary e.g., note how the "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-deleteSd"}},[_v("this sequence diagram")]),_v(" shows only the detailed interactions within the Logic component i.e., does not show detailed interactions within the model component.")],1)]),_v(" "),_c('li',[_c('strong',[_v("Break diagrams into smaller fragments")]),_v(" when possible.\n"),_c('ul',[_c('li',[_v("If a component has a lot of classes, consider further dividing into subcomponents (e.g., a Parser subcomponent inside the Logic component). After that, subcomponents can be shown as black-boxes in the main diagram and their details can be shown as separate diagrams.")]),_v(" "),_c('li',[_v("You can use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("ref")]),_v(" frames to break sequence diagrams to multiple diagrams. Similarly, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("rake")]),_v("s can be used to divide activity diagrams.")])])]),_v(" "),_c('li',[_c('strong',[_v("Stay at the highest level of abstraction")]),_v(" possible e.g., note how "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-archiSd"}},[_v("this sequence diagram")]),_v(" shows only the interactions between architectural components, abstracting away the interactions that happen inside each component.")],1),_v(" "),_c('li',[_c('strong',[_v("Use visual representations")]),_v(" as much as possible. E.g., show associations and navigabilities using lines and arrows connecting classes, rather than adding a variable in one of the classes.")]),_v(" "),_c('li',[_v("For some more examples of what NOT to do, see "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-umlExamples"}},[_v("here")]),_v(".")],1)])]),_v(" "),_c('li',[_c('strong',[_v("Integrate diagrams into the description.")]),_v(" Place the diagram close to where it is being described.")]),_v(" "),_c('li',[_c('strong',[_v("Use code snippets sparingly.")]),_v(" The more you use code snippets in the DG, and longer the code snippet, the higher the risk of it getting outdated quickly. Instead, use code snippets only when necessary and cite only the strictly relevant parts only. You can also use pseudocode instead of actual programming code.")]),_v(" "),_c('li',[_c('strong',[_v("Resize diagrams")]),_v(" so that the text size in the diagram matches the text size of the main text of the diagram. See "),_c('trigger',{attrs:{"trigger":"click","for":"modal:ipWeek10-diagramSizeNegative"}},[_v("example")]),_v(".")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-umlExamples"},scopedSlots:_u([{key:"header",fn:function(){return [_v("UML Diagrams: Negative Examples ")]},proxy:true}])},[_v(" "),_c('p',[_v("These class diagrams seem to have lot of member details, which can get outdated pretty quickly:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-3.github.io/main/images/PollClassDiagram.png","width":"750"}}),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w10-4.github.io/main/images/healthPlanClassDiagram.png","width":"750"}})],1),_v(" "),_c('hr'),_v("\n This class diagram seems to have too many classes:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/ModelClassDiagram.png","width":"750"}}),_v(" "),_c('hr'),_v("\n These sequence diagrams are bordering on 'too complicated':"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-w13-1.github.io/main/images/TagCommandSequenceDiagram.png","width":"750"}}),_v(" "),_c('p'),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://cs2103-ay1819s1-f10-1.github.io/main/images/modifyPermissionSequenceDiagram.png","width":"750"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-diagramSizeNegative"},scopedSlots:_u([{key:"header",fn:function(){return [_v("Diagram resizing: a negative example")]},proxy:true}])},[_v(" "),_c('p',[_v("In this negative example, the text size in the diagram is much bigger than the text size used by the document:"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/diagramSizeNegativeExample.png","width":"200"}}),_c('br'),_v("\nIt will look more 'polished' if the two text sizes match.")],1)]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-logicClassDiagram"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Class Diagram of the Logic Component")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/LogicClassDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-deleteSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Sequence Diagram for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("delete")]),_v(" command")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/DeleteSequenceDiagram.png","width":"900"}})],1),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:ipWeek10-archiSd"},scopedSlots:_u([{key:"header",fn:function(){return [_v("AB3 - Architecture-Level Sequence Diagram")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://se-education.org/addressbook-level3/images/ArchitectureSequenceDiagram.png"}})],1)],1)],1)])])],1),_c('p'),_v(" "),_m(21),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Project Portfolio Page "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_c('s',[_v("At the end of the project each student is required to submit a "),_c('em',[_v("Project Portfolio Page")]),_v(".")]),_v(" "),_c('mark',[_c('strong',[_v("To reduce workload, this deliverable "),_c('span',{staticClass:"text-success"},[_v("has been made optional")]),_v(" this semester.")])]),_v(" You need to submit this only if you think your team members are not fully aware of your contribution to the tP. Also, we will ask you to submit this if there is a dispute about your contribution level.")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"secondary","peek":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Details ... (read only if you opted to submit this deliverable)")])]},proxy:true}])},[_v(" "),_c('h4',{attrs:{"id":"ppp-objectives-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Objectives")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-objectives-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("For you to use "),_c('span',{staticClass:"dimmed"},[_v("(e.g. in your resume)")]),_v(" as a well-documented data point of your SE experience")]),_v(" "),_c('li',[_v("For evaluators to use as a data point for evaluating your project contributions")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-sections-to-include-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Sections to include")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-sections-to-include-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Overview")]),_v(": A short overview of your product to provide some context to the reader. The opening 1-2 sentences may be reused by all team members. If your product overview extends beyond 1-2 sentences, the remainder should be written by yourself.")]),_v(" "),_c('li',[_c('strong',[_v("Summary of Contributions")]),_v(" --Suggested items to include:\n"),_c('ul',[_c('li',[_c('strong',[_v("Code contributed")]),_v(": Give a link to your code on "),_c('a',{attrs:{"href":"https://nus-cs2103-ay2425s1.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other"}},[_v("tP Code Dashboard")]),_v(". The link is available in the "),_c('a',{attrs:{"href":"/website/admin/teamList.html"}},[_v("Project List Page")]),_v(" -- linked to the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-code",attrs:{"aria-hidden":"true"}})]),_v(" icon under your profile picture.")]),_v(" "),_c('li',[_c('strong',[_v("Enhancements implemented:")]),_v(" A summary of the enhancements you implemented.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the UG:")]),_v(" Which sections did you contribute to the UG?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to the DG:")]),_v(" Which sections did you contribute to the DG? Which UML diagrams did you add/updated?")]),_v(" "),_c('li',[_c('strong',[_v("Contributions to "),_c('trigger',{attrs:{"trigger":"click","for":"modal:deliverablesPPP-teamTasks"}},[_v("team-based tasks ")])],1)]),_v(" "),_c('li',[_c('strong',[_v("Review/mentoring contributions:")]),_v(" Links to PRs reviewed, instances of helping team members in other ways.")]),_v(" "),_c('li',[_c('strong',[_v("Contributions beyond the project team:")]),_v(" "),_c('ul',[_c('li',[_v("Evidence of helping others "),_c('span',{staticClass:"dimmed"},[_v("e.g. responses you posted in our forum, bugs you reported in other team's products")]),_v(",")]),_v(" "),_c('li',[_v("Evidence of technical leadership "),_c('span',{staticClass:"dimmed"},[_v("e.g. sharing useful information in the forum")])])])])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_v("Keep in mind that evaluators will use the PPP to estimate your project effort. We recommend that you mention things that will earn you a fair score "),_c('span',{staticClass:"dimmed"},[_v("e.g., explain how deep the enhancement is, why it is "),_c('em',[_v("complete")]),_v(", how hard it was to implement etc.")])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the Developer Guide (Extracts)")]),_v(": Reproduce the parts in the Developer Guide that you wrote. Alternatively, you can show the various diagrams you contributed.")]),_v(" "),_c('li',[_c('strong',[_c('span',{staticClass:"badge rounded-pill bg-success"},[_v("OPTIONAL")]),_v(" Contributions to the User Guide (Extracts)")]),_v(": Reproduce the parts in the User Guide that you wrote.")])]),_v(" "),_c('h4',{attrs:{"id":"ppp-format-2"}},[_c('span',{staticClass:"badge bg-info"},[_v("PPP")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ppp-format-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("File name (i.e., in the repo): "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/github_username_in_lower_case.md")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("docs/team/goodcoder123.md")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-cube",attrs:{"aria-hidden":"true"}})]),_v(" Follow the "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/team/johndoe.html"}},[_v("example in the AddressBook-Level3")])]),_v(" "),_c('li',[_v("PDF file submission: not required.")])])]),_c('p')],1)])])],1),_c('p'),_v(" "),_m(22),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → Deliverables → Product Website "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('div',[_c('p',[_v("When setting up your team repo, you would be configuring "),_c('strong',[_v("the GitHub Pages feature to publish your documentation")]),_v(" as a website.")]),_v(" "),_c('h4',{attrs:{"id":"website-home-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("Home page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-home-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Update to match your product.")])]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103 m--cs2113"}},[_c('h4',{attrs:{"id":"website-ui-png"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ui-png","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('ul',[_c('li',[_c('mark',[_v("Ensure the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" matches the current product")])])])]),_v(" "),_c('div',{staticClass:"indented-level3",attrs:{"id":"tips-for-product-screenshot"}},[_c('box',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',{staticClass:"text-info"},[_v("Some common sense tips for a good product screenshot")])]),_v(" "),_c('p',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Ui.png")]),_v(" should showcase your product "),_c('span',{staticClass:"underline"},[_v("in its full glory")]),_v(".")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Populate the product with "),_c('em',[_v("realistic")]),_v(" data")]),_v(" before taking the screenshot. For example,\n"),_c('ul',[_c('li',[_v("if the UI is supposed to show profile photos, use real profile photos instead of dummy placeholders.")]),_v(" "),_c('li',[_v("if the UI shows text, don't use trivial/garbage values such as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("test 123")]),_v(" or values a\ntypical user is unlikely to use.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use data that make the product "),_c('em',[_v("look good")])]),_v(" e.g., if the product doesn't have nice line wrapping for long inputs/outputs, don't use such inputs/outputs for the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid too many blank areas")]),_v(". If you show the product in a well-populated state there shouldn't be largely blank areas that could be filled up instead.")]),_v(" "),_c('li',[_v("Choose a state that showcases the main features of the product "),_c('span',{staticClass:"dimmed"},[_v("i.e., the login screen is not usually a good choice")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Take a "),_c('em',[_v("clean")]),_v(" screenshot with a decent resolution.")]),_v(" Some screenshot tools can capture a specified window only. If your tool cannot do that, make sure you "),_c('strong',[_v("crop away the extraneous parts")]),_v(" captured by the screenshot.")]),_v(" "),_c('li',[_c('strong',[_v("Avoid annotations")]),_v(" (arrows, callouts, explanatory text etc.); it should look like the product is in use for real.")])]),_v(" "),_c('panel',{attrs:{"tags":"m--cs2103","type":"seamless","expanded":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Examples")])]},proxy:true}])},[_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Distracting annotations.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: Not enough data. Should have used real profile pictures instead of placeholder images.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood2.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👎 Not Good")]},proxy:true}])},[_v(" "),_c('p',[_v("Reason: screenshot not cropped cleanly (contains extra background details)")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-notGood3.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/Ui-good1.png","width":"600"}})],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("👍 Good")]},proxy:true}])},[_v(" "),_c('pic',{attrs:{"eager":"","src":"https://ay1920s2-cs2103-w15-2.github.io/main/images/Ui.png","width":"600"}})],1)],1)],1)],1)],1)]),_v(" "),_c('h4',{attrs:{"id":"website-aboutus-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("AboutUs Page")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-aboutus-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use a suitable profile photo.")])])]),_v(" "),_c('div',{staticClass:"indented-level2",attrs:{"id":"profile-photo"}},[_c('p',[_v("The purpose of the profile photo is for the reader to identify you. Therefore, choose a "),_c('mark',[_v("recent individual photo showing your face clearly")]),_v(" (i.e., not too small) -- somewhat similar to a passport photo. Given below are some examples of good and bad profile photos."),_c('br'),_v(" "),_c('pic',{staticStyle:{"width":"365.33px"},attrs:{"eager":"","src":"/website/admin/images/profilephotos.png"}})],1),_v(" "),_c('p',[_v("If you are uncomfortable posting your photo due to security reasons, you can post a lower resolution image so that it is hard for someone to misuse that image for fraudulent purposes. If you are concerned about privacy, you may use "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/File:Portrait_placeholder.png"}},[_v("a placeholder image")]),_v(" in place of the photo in course-related documents that are publicly visible.")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Include a link to each person's PPP page.")])]),_v(" "),_c('li',[_c('strong',[_v("Team member names:")]),_v(" you may use the full name, part of the name, or GitHub username of the team member.")])]),_v(" "),_c('h4',{attrs:{"id":"website-ug-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("UG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-ug-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])]),_v(" "),_c('h4',{attrs:{"id":"website-dg-web-page"}},[_c('span',{staticClass:"badge bg-info"},[_v("Website")]),_v(" "),_c('span',{staticClass:"text-info"},[_v("DG (Web Page)")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#website-dg-web-page","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Should match the submitted PDF file.")])])])])])],1),_c('p')],1),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"3-prepare-for-the-practical-exam"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("3")])],1)],1),_v(" "),_m(23),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#3-prepare-for-the-practical-exam","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Overview")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('strong',[_v("PE is not entirely a pleasant experience, but is an essential component")]),_v(" that aims to increase the quality of the tP work, and the rigor of tP grading.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("more details on the motivation and objectives...")])]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('strong',[_v("The upfront objective of the PE is to increase the rigor of project grading.")]),_v(" Assessing most aspects of the project involves an element of subjectivity. As the project counts for a large percentage of the final grade, it is not prudent to rely on evaluations of tutors alone as there can be significant variations between how different tutors assess projects. That is why we collect more data points via the PE to minimize the chance of your project being affected by evaluator-bias.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates your testing skills")]),_v(", done as the following two-parts:\n"),_c('ol',[_c('li',[_c('strong',[_v("You will be given a chance to find bugs in a different software.")]),_v(" Furthermore, you will be given an opportunity to "),_c('s',[_v("defend your bug reports against any possible objections")]),_v(" interact with the developers (anonymously) to refine the bug report further "),_c('span',{staticClass:"dimmed"},[_v("e.g., correct the severity level if the level you chose initially was incorrect")]),_v(". If you report possible bugs that turn out to be actual bugs, you earn marks (provided the product actually had bugs in the first place).")]),_v(" "),_c('li',[_c('strong',[_v("Your product will be subjected to a rigorous testing")]),_v(" and you will be given a chance to point out any inaccuracies in the bugs reported. You will lose marks for any bugs that turned out to be real bugs, but only if your work has more bugs than a certain bar.")])])]),_v(" "),_c('li',[_c('strong',[_v("The above two can lead to high-rigor, "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("based on how well you achieve the objectives of testing, as opposed to indirect measures such as number of test cases")]},proxy:true}])},[_c('em',[_v("outcome-based")])]),_v(" evaluation of your testing skills")],1),_v(". The alternative is to rely solely on other easy-to-measure metrics "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the number of test cases, test coverage, test LoC etc.)")]),_v(" which we don't think as good representations of your actual testing skills.\n"),_c('strong',[_v("The "),_c('em',[_v("ultimate")]),_v(" objective of the PE is not even the higher rigor of grading.")]),_v(" Because of the PE, you will realize that any bugs are very likely to be detected, which means you will work extra hard to avoid bugs; and THAT is the real benefit. Ultimately, "),_c('span',{staticClass:"text-success"},[_c('strong',[_v("what we want is for you to internalize a higher standard for testing and a lower tolerance for bugs in your own code")])]),_v(" -- something that can have a longer-lasting impact on your future careers, beyond the mere course grade.")]),_v(" "),_c('li',[_c('strong',[_v("Problem: There is no way we can carry out the above-mentioned")]),_v(" two-part evaluation at a high-level of rigor if using tutors as testers, or using an automated testing script. "),_c('span',{staticClass:"dimmed"},[_v("e.g., some tutors might not have the motivation to try hard enough to find bugs, and it will be hard to find tutors willing to spend many hours testing products so near to their own exams.")]),_c('br'),_v(" "),_c('strong',[_v("Solution: Get the two parts of the evaluation to feed each other")]),_v(" by getting student to test each other's products.")]),_v(" "),_c('li',[_c('strong',[_v("The fact that you are testing products created by your classmates and objecting to bugs reported by your classmates can make this a rather 'unpleasant' experience")]),_v(". You might feel like "),_c('em',[_v("being pitted against each other")]),_v(", or as if "),_c('em',[_v("you are forced to bring down each other")]),_v(". But as you read above, it is a necessary evil for this evaluation to be even possible. Given the actual goal is to get you to create products with very few bugs, we think switching off the 'collaborative learning' mode for just a few days is a price worth paying to achieve that goal. After all, the PE is an evaluation activity (not a "),_c('em',[_v("learning activity")]),_v(") and happens "),_c('em',[_v("after")]),_v(" the regular learning period is over.")]),_v(" "),_c('li',[_c('strong',[_v("You are not taking marks from someone else")]),_v(" -- at least, don't think of it that way. The point of contention is 'is this really a bug?' which is independent of the people involved. Furthermore, the reward for detecting a bug and the penalty for having a bug in your code are calculated independently.")]),_v(" "),_c('li',[_c('strong',[_v("Still, "),_c('em',[_v("none of us")]),_v(" likes it when others point out problems of our work")]),_v(". Some of us don't even like pointing out problems of others' work. But "),_c('mark',[_v("we just have to learn not to take bug reports personally")]),_v(". Another important intended outcome is to be able to report bugs in a way that doesn't feel like you are "),_c('em',[_v("attacking")]),_v(" or trying to "),_c('em',[_v("sabotage")]),_v(" the dev team.")]),_v(" "),_c('li',[_c('strong',[_v("PE also evaluates aspects other than testing")]),_v(" e.g., your product evaluation skills, effort estimation skills etc. When evaluating those aspects in particular, they are "),_c('mark',[_v("not graded solely based on peer ratings")]),_v(". Rather, PE data are cross-validated with tutors' grades to identify cases that need further investigation. When peer inputs are used for grading, they are usually combined with tutors' grades with appropriate weight for each. In some cases ratings from team members are given a higher weight compared to ratings from other peers, if that is appropriate.")])])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("The PE is divided into four phases")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 1: Bug Reporting")])]),_v(": "),_c('span',{attrs:{"id":"pe-p1-desc"}},[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part I")]),_v(" "),_c('strong',[_v("Product Testing")]),_v(" [60 minutes] -- to focus on reporting bugs in the product (but can report documentation bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part II")]),_v(" "),_c('strong',[_v("Evaluating Documents")]),_v(" [30 minutes] -- to focus on reporting bugs in the UG and DG (but can report product bugs too)")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part III")]),_v(" "),_c('strong',[_v("Overall Evaluation")]),_v(" [15 minutes] -- to give overall evaluation of the product, documentation, effort, etc.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge bg-success"},[_v("Phase 1 - part IV")]),_v(" "),_c('strong',[_v("Trimming Bugs")]),_v(" [half a day] -- For testers to select up to 7 bugs to send to the dev team.")])])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 2: Developer Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p2-desc"}},[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Phase 3: Tester Response")])]),_v(": "),_c('span',{attrs:{"id":"pe-p3-desc"}},[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")])]),_v(" "),_c('li',[_c('strong',{staticClass:"text-secondary"},[_c('strong',[_v("Phase 4: Tutor Moderation")])]),_v(": "),_c('span',{attrs:{"id":"pe-p4-desc"}},[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")]),_c('br'),_c('br')])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Grading")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("Your performance in the practical exam will affect your final grade and your peers', as explained in "),_c('a',{attrs:{"href":"/website/admin/tp-grading.html"}},[_c('em',[_v("Admin: Project Grading")])]),_v(" section.")]),_v(" "),_c('li',[_v("As such, we have put in measures to identify and "),_c('mark',[_v("penalize insincere/random evaluations")]),_v(".")]),_v(" "),_c('li',[_v("Also see:")])])])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Notes on how marks are calculated for PE "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p')])])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Preparation, Restrictions")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-preparation-restrictions"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Preparation, Restrictions")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-preparation-restrictions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{attrs:{"id":"pe-mode-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Mode: you can choose between remote or F2F")]),_v(" (we'll use a Canvas survey to collect your preferred mode):\n"),_c('ul',[_c('li',[_c('strong',[_v("Remote mode")]),_v(": This is the "),_c('mark',[_v("recommended mode")]),_v(". Proctored via Zoom. You'll need to join the Zoom session from a quiet place (i.e., conducive to an exam) at which you can set up a Zoom device for proctoring."),_c('br'),_v("\nChoose this mode only if you are able to comply with the Zoom proctoring requirements given further down.")]),_v(" "),_c('li',[_c('strong',[_v("F2F mode")]),_v(": Attend the PE at the lecture venue (UTown-AUD2)."),_c('br'),_v("\nChoose only if you are unable to use the remote mode (reason: higher the number of F2F attendees, higher the risk of Wi-Fi speed issues and GitHub throttling issues).")])])])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Those opting for the F2F mode can ignore any Zoom-related points")]),_v(" in the instructions below.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("When")]),_v(": "),_c('mark',[_v("Last lecture slot of the semester")]),_v(" (Fri, Nov 15th). Remember to "),_c('mark',[_v("join 15-30 minutes earlier")]),_v(" than usual lecture start time. The Zoom link will be given to you closer to the day.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("PE Phase 1 will be conducted under exam conditions. For the remote mode, "),_c('mark',[_v("we will be following the "),_c('a',{attrs:{"href":"https://mysoc.nus.edu.sg/academic/e-exam-sop-for-students/"}},[_v("SoC's E-Exam SOP")])])]),_v(", combined with the deviations/refinements given below. Any non-compliance will be dealt with similar to a non-compliance in the final exam."),_c('br')])])]),_v(" "),_c('div',{attrs:{"id":"pe-proctoring-info"}},[_c('ul',[_c('li',[_c('strong',[_v("Remote mode proctoring will be done via Zoom.")]),_v(" No admission if the following requirements are not met.\n"),_c('ul',[_c('li',[_c('strong',[_v("You need two Zoom devices")]),_v(" (PC: chat, audio "),_c('s',[_v("video")]),_v(", Phone: video, "),_c('s',[_v("audio")]),_v("), unless you have an external webcam for your PC.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" To change the Zoom display name as required by the PE, join the Zoom call, go to the 'Participation' panel, and search for yourself. Then, click on 'More', followed by 'Rename'.")]),_v(" "),_c('li',[_c('strong',[_v("Add your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[PE_seat_number]")]),_v(" in front of the "),_c('em',[_v("first name")]),_v(" of your Zoom display name")]),_v(", in your Zoom devices. "),_c('mark',[_v("Seat numbers can be found in "),_c('a',{attrs:{"href":"https://docs.google.com/spreadsheets/d/e/2PACX-1vSUbcJpMC5OdJkr_K6VxDwAkkrwJsqAFSPwHmZq88EbOdAWIPMeYvDQDYOUEcsEYVwACmAz5hH0W0ZY/pubhtml?gid=0&single=true"}},[_v("here")])]),_v(" about 2 days before the PE. e.g.,\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18] John Doe")]),_v(" ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("M18")]),_v(" is the seat number)")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("[M18][PC] John Doe")]),_v(" (for the PC, if using a phone as well)")])])]),_v(" "),_c('li',[_c('strong',[_v("Set your camera")]),_v(" so that "),_c('em',[_v("all")]),_v(" the following are visible:\n"),_c('ol',[_c('li',[_v("your face (side view, "),_c('mark',[_v("no mask")]),_v(")")]),_v(" "),_c('li',[_v("your hands")]),_v(" "),_c('li',[_v("the work area (i.e., the tabletop)")]),_v(" "),_c('li',[_v("the computer screen"),_c('br'),_v(" "),_c('pic',{attrs:{"eager":"","src":"/website/admin/images/zoomCameraExample.png","width":"362"}})],1)])])])])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Strongly recommended to join the Zoom waiting room "),_c('mark',[_v("15-30 minutes before the start time")]),_v(".")]),_v(" Admitting you to the Zoom session can take some time. You need to be in the meeting and ready to start the PE by 4.05pm"),_c('br'),_v(" "),_c('strong',[_v("If on F2F mode:")]),_v(" Strongly recommended to arrive at lecture venue (UTown-AUD2) around 10-15 minutes early. We can allow only 5 minutes (i.e., until 4.05pm) for you to get ready to start the PE.")]),_v(" "),_c('li',[_c('strong',[_v("In case of Zoom outage")]),_v(", we'll fall back on MS Teams (MST). Make sure you have MST running and have joined the "),_c('a',{attrs:{"href":"https://teams.microsoft.com/l/team/19%3Az_9lZUZjWhfIO2XRJ_u4EJy-MvmmEV7uwzp4EGO3xtU1%40thread.tacv2/conversations?groupId=f7d44b48-1c75-4d2c-82e8-831f192b8a07&tenantId=5ba5ef5e-3109-4e77-85bd-cfeb0d347e82"}},[_v("MST Team for the class")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recording the screen is not required.")])]),_v(" "),_c('li',[_c('strong',[_v("You are allowed to use head/ear phones.")]),_v(" But no talking allowed (unless you are talking to the invigilator) -- so, no talking/singing to yourself as this can be mistaken for a rule violation.")]),_v(" "),_c('li',[_c('strong',[_c('mark',[_v("Only one screen")]),_v(" is allowed")]),_v(" (for both remote mode and F2F mode). If you want to use the secondary monitor, you should switch off the primary monitor. The screen being used should be fully visible in the Zoom camera view."),_c('br'),_v("\nIf using a second device for Zoom proctoring, the screen of that device should only be used for Zoom.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use the public chat channel to ask questions")]),_v(" from the prof. If you do, you might accidentally reveal which team you are testing.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use more than one CATcher instance")]),_v(" at the same time. Our grading scripts will red-flag you if you use multiple CATcher instances in parallel.")]),_v(" "),_c('li',[_c('strong',[_v("Use MS Teams (not Zoom) private messages to communicate with the prof.")]),_v(" Zoom sessions are invigilated by tutors, not the prof.")]),_v(" "),_c('li',[_c('strong',[_v("Do not view video Zoom feeds of others")]),_v(" while the testing is ongoing. Keep the video view minimized.")]),_v(" "),_c('li',[_c('strong',[_v("Bug reporting will be done using CATcher")]),_v(", similar to,")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"primary","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("PE-D Preparation")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_c('p',[_v("Ensure that you have accepted the invitation to join the GitHub org used by the course. Go to "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1"}},[_v("https://github.com/nus-cs2103-AY2425S1")]),_v(" to accept the invitation.")])]),_v(" "),_c('li',[_c('p',[_v("Ensure you have access to a "),_c('strong',[_v("computer that is able to run course projects")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g. has the right Java version")]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Ensure you can use "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")])]),_v(" on your computer. You should have done this when you smoke-tested CATcher earlier in the semester.")])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("If not using CATcher")])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"not-using-catcher-warning"}},[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('div',{attrs:{"id":"pe-create-repo"}},[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Have a good screen grab tool")]),_v(" with annotation features so that you can quickly take a screenshot of a bug, annotate it, and post in using CATcher."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" You can use "),_c('kbd',[_v("Ctrl")]),_v("+"),_c('kbd',[_v("V")]),_v(" to paste a picture from the clipboard into a text box in a bug report.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("[Optional] Have a good screen recording tool")]),_v(" if you plan to use screen recording clips as part of your bug reports. Ensure that your screen recording tool can create small files as CATcher doesn't allow files bigger than 10Mb."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})]),_v(" As the CATcher support for uploading screen recordings is new and limited, use it only if strictly necessary -- use screenshots for other cases.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_c('span',{staticClass:"text-danger"},[_v("Download the product to be tested")])]),_v(".")])])]),_v(" "),_c('tabs',{attrs:{"active":"1","add-class":"ml-4"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified which team to test (likely to be in the morning of PE-D day), download the JAR file and the UG PDF file from the team's latest release.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("After you have been notified of the download location, download the zip file that bears your name. The password required to unzip it will be given to you at the start of the PE.")])])])],1),_v(" "),_c('p'),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',{staticClass:"text-success"},[_c('strong',[_v("Testing tips")])])]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Use easy-to-remember patterns in test data.")]),_v(" For example, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("12345678")]),_v(" as a phone number while testing and it appears as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2345678")]),_v(" somewhere else in the UI, you can easily spot that the first digit has gone missing. But if you used a random number instead, detecting that bug won't be as easy. Similarly, if you use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Bee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Benny Lee")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Charles Pereira")]),_v(" as test data (note how the names start with letters A, B, C), it will be easy to detect if one goes missing, or they appear in the incorrect order.")]),_v(" "),_c('p',[_c('span',{staticClass:"text-success"},[_c('strong',[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("Go wide before you go deep")]),_v(". Do a light testing of all features first. That will give you a better idea of which features are likely to be more buggy. Spending equal time for all features or testing in the order the features appear in the UG is not always the best approach.")])])],1),_v(" "),_c('p')],1)])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("During the bug reporting periods (i.e., "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")]),_v(" and "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part II")]),_v("), do not use websites/software not in the list given below.")]),_v(" If you need to visit a different website or use another software, please ask for permission first.\n"),_c('ul',[_c('li',[_v("Website: Canvas")]),_v(" "),_c('li',[_v("Website/software: MSTeams (only to communicate with the prof of Tech support)")]),_v(" "),_c('li',[_v("Website: Course website "),_c('span',{staticClass:"dimmed"},[_v("(e.g., to look up PE info)")])]),_v(" "),_c('li',[_v("Software: CATcher, any text editor, any screen grab/recording software")]),_v(" "),_c('li',[_v("Software: PDF reader "),_c('span',{staticClass:"dimmed"},[_v("(to read the UG/DG or other references such as the textbook)")])]),_v(" "),_c('li',[_v("Software: A text editor or word processing software "),_c('span',{staticClass:"dimmed"},[_v("(to keep notes while testing)")])])])]),_v(" "),_c('li',[_c('mark',[_c('strong',[_v("Do not visit GitHub in")]),_v(" "),_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - part I")])]),_v(" unless you are going there to download a file the team has provided and is needed for testing. You may visit GitHub during part II and part III.")]),_v(" "),_c('li',[_c('strong',[_v("Do not use any other software running")]),_v(" in the background e.g., Telegram chat.")]),_v(" "),_c('li',[_c('strong',[_v("This is a "),_c('em',[_v("manual")]),_v(" testing session")]),_v(". Do not use any test automation tools or custom scripts.")]),_v(" "),_c('li',[_c('strong',[_v("You may use any digital/physical notes")]),_v(" during the PE "),_c('span',{staticClass:"dimmed"},[_v("e.g., a list of things to check")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Recommended to read the guidelines the dev team will follow when responding to your bug reports later")]),_v(", given in the panel below. This will help decide what kind of bugs to report.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs reported during the PE should be the result of your own testing")]),_v(". "),_c('span',{staticClass:"text-danger"},[_v("Reporting bugs found by others as your own will be reported as a case of academic dishonesty")]),_v(" (severity is similar to cheating during the final exam).")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"info","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Guidelines for the dev team to follow when triaging PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws","onclick":"event.stopPropagation()"}})]),_v(" "),_c('modal',{staticClass:"algolia-no-index",attrs:{"large":"","id":"modal:bugTriaging-whenOutOfScope"}},[_c('div',[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])])]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])],1),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("[Within 24 hours prior to the PE] Get CATcher 'warmed-up' for the PE")]),_v("."),_c('br'),_v(" "),_c('mark',[_v("Strongly recommended")]),_v(" to do the following about a day in advance, so that there is enough lead time to sort out any CATcher-related problems "),_c('em',[_v("before")]),_v(" the PE.\n"),_c('ol',[_c('li',[_v("Login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher")]),_v(",\nwhile choosing the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(" as the session.")]),_v(" "),_c('li',[_v("Allow CATcher to create a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(", when asked.")]),_v(" "),_c('li',[_v("Create a dummy bug report. Edit it. Delete it."),_c('br'),_v("\nCaution: Do not reuse these dummy bug reports (i.e., by editing them later) to submit real PE bugs.\nAs they were created outside the PE duration, they will be ignored by PE bug processing scripts.")]),_v(" "),_c('li',[_v("If you encounter any problems, post in the "),_c('a',{attrs:{"href":"https://github.com/CATcher-org/CATcher/issues"}},[_v("CATcher issue tracker")]),_v(".")])])])])])])],1),_c('p'),_v(" "),_m(24)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"4-ensure-the-code-is-reposense-compatible"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("4")])],1)],1),_v(" "),_m(25),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#4-ensure-the-code-is-reposense-compatible","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('div',{attrs:{"id":"midV13-repoSenseCompatible"}},[_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Ensure your code is "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., RepoSense can detect your code as yours")]},proxy:true}])},[_v("RepoSense-compatible")])],1),_v(" and the "),_c('strong',[_v("code it attributes to you is indeed the code written by you")]),_v(", as explained below:")]),_v(" "),_m(26),_v(" "),_c('p'),_v(" "),_m(27)])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" Tools → RepoSense "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h2',{attrs:{"id":"tool-reposense-for-authorship-tracking-2"}},[_v("Tool: RepoSense (for authorship tracking)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tool-reposense-for-authorship-tracking-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/reposenseOverview.png"}}),_v(" "),_c('p',[_v("We will be using a tool called "),_c('a',{attrs:{"href":"http://reposense.org"}},[_v("RepoSense")]),_v(" to make it "),_c('strong',[_v("easier for you to see (and learn from) code written by others")]),_v(", and to help us see who wrote which part of the code.")]),_v(" "),_c('pic',{attrs:{"eager":"","src":"https://reposense.org/images/report-features.png","alt":"RepoSense report screenshot"}},[_c('sub',[_v("Figure: RepoSense Report Features")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("Viewing the current status of code authorship data:")])])]),_v(" "),_c('ul',[_c('li',[_v("The reports generated by the tool for the individual and team projects will be made available in the course website at some point in the semester. The feature that is most relevant to you is the "),_c('em',[_v("Code Panel")]),_v(" (shown on the right side of the screenshot above). It shows the code attributed to a given author.")]),_v(" "),_c('li',[_v("Click on your name to load the code attributed to you (based on Git blame/log data) onto the code panel on the right.")]),_v(" "),_c('li',[_v("If the code shown roughly matches the code you wrote, all is fine and there is nothing for you to do.")])]),_v(" "),_c('p',[_c('strong',[_c('strong',[_v("If the code does not match the actual authorship:")])]),_v(" Given below are the possible reasons for the code shown to mismatch the code you wrote.")]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Reason 1:")]),_v(" the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of some of your commits is not known to RepoSense -- this is a result of not setting the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git.username")]),_v(" property as instructed "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-git-for-revision-control"}},[_v("in our Git setup instructions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("How to check:")]),_v(" Find the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Author name")]),_v(" of your commits that are "),_c('em',[_v("missing")]),_v(" (you can use Sourcetree or the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("git log")]),_v(" command for that -- it's not possible to do that using the GitHub interface though)."),_c('br'),_v(" Check if that author name is included in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/ip-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the iP")]),_v(" or the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/tp-dashboard/blob/master/configs/author-config.csv"}},[_v("RepoSense config for the tP")]),_v(" (whichever the applicable one)"),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Send the missing author name(s) to the prof so that the RepoSense configuration can be updated accordingly.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Reason 2:")]),_v(" The actual authorship does not match the authorship determined by git blame/log e.g., another student touched your code after you wrote it, and Git log attributed the code to that student instead."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" You can add "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" annotations as explained in the panel below:")])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to indicate authorship")])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"adding-author-tags-indicate-authorship-3"}},[_v("Adding "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags indicate authorship"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#adding-author-tags-indicate-authorship-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_v("Mark your code with a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGithubUsername}")]),_v(". Note the double "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@")]),_v("."),_c('br'),_v("\nThe "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag should indicates the beginning of the code you wrote. The code up to the next "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" tag or the end of the file (whichever comes first) will be considered as was written by that author.\nHere is a sample code file:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author sarahkhoo")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you don't know who wrote the code segment below yours")]),_v(", you may put an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" (i.e. no GitHub username) to indicate the end of the code segment you wrote. The author of code below yours can add the GitHub username to the empty tag later.\nHere is a sample code with an empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("author")]),_v(" tag:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("method 0 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author")]),_v("\n")]),_c('span',[_v("method 3 ...\n")]),_c('span',[_v("method 4 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The author tag syntax varies based on file type")]),_v(" e.g. for java, css, fxml. Use the corresponding comment syntax for non-Java files."),_c('br'),_v("\nHere is an example code from an xml/fxml file. This format works for Markdown/MarkBind files as well.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("")]),_v("\n")]),_c('span',[_v("\n")]),_c('span',[_v(" \n")]),_c('span',[_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_v("...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not put the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author")]),_v(" inside java header comments")]),_v("."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("* @@author johndoe")]),_v("\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe")]),_v("\n")]),_c('span',[_v("/**\n")]),_c('span',[_v(" * Returns true if ...\n")]),_c('span',[_v(" */\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])])]),_v(" "),_c('h4',{attrs:{"id":"what-to-and-what-not-to-annotate-3"}},[_v("What to and what not to annotate"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#what-to-and-what-not-to-annotate-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Annotate both functional and test code")]),_v(" There is no need to annotate documentation files.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Annotate only significant size code blocks that can be reviewed on its own")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., a class, a sequence of methods, a method.")]),_v(" "),_c('br'),_v(" "),_c('strong',[_v("Claiming credit for code blocks smaller than a method is discouraged")]),_v(" but allowed. If you do, do it sparingly and only claim meaningful blocks of code such as a block of statements, a loop, or an if-else statement.")]),_v(" "),_c('ul',[_c('li',[_v("If an enhancement required you to do tiny changes in many places, there is no need to annotate all those tiny changes; you can describe those changes in the Project Portfolio page instead.")]),_v(" "),_c('li',[_v("If a code block was touched by more than one person, either let the person who wrote most of it (e.g. more than 80%) take credit for the entire block, or leave it as 'unclaimed' (i.e., no author tags).")]),_v(" "),_c('li',[_v("Related to the above point, "),_c('mark',[_v("if you claim a code block as your own, more than 80% of the code in that block should have been written by yourself")]),_v(". For example, no more than 20% of it can be code you reused from somewhere.")]),_v(" "),_c('li',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" GitHub has a "),_c('a',{attrs:{"href":"https://help.github.com/articles/tracing-changes-in-a-file/"}},[_c('em',[_v("blame")]),_v(" feature and a "),_c('em',[_v("history")])]),_v(" feature that can help you determine who wrote a piece of code.")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Do not try to boost the quantity of your contribution using unethical means")]),_v(" such as duplicating the same code in multiple places. In particular, do not copy-paste test cases to create redundant tests. Even repetitive code blocks within test methods should be extracted out as utility methods to reduce code duplication.\nIndividual members are responsible for making sure code attributed to them are correct.\nIf you notice a team member claiming credit for code that he/she did not write or use other questionable tactics, you can email us (after the final submission) to let us know.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you wrote a significant amount of code that was not used in the final product")]),_v(",")]),_v(" "),_c('ul',[_c('li',[_v("Create a folder called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("{project root}/unused")])]),_v(" "),_c('li',[_v("Move unused files (or copies of files containing unused code) to that folder")]),_v(" "),_c('li',[_v("use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-unused")]),_v(" to mark unused code in those files (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("unused")]),_v(")\ne.g.")])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-unused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])]),_c('p',[_v("Please put a comment in the code to explain why it was not used.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("If you reused code from elsewhere,")]),_v(" mark such code as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("//@@author {yourGitHubUsername}-reused")]),_v(" (note the suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("reused")]),_v(")\ne.g.")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"highlighted"}},[_v("//@@author johndoe-reused")]),_v("\n")]),_c('span',[_v("method 1 ...\n")]),_c('span',[_v("method 2 ...\n")])]),_c('div',{staticClass:"function-btn-container"},[_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"copyCodeBlock(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"d":"M 11.273438 0 L 2.546875 0 C 1.746094 0 1.089844 0.613281 1.089844\n 1.363281 L 1.089844 10.910156 L 2.546875 10.910156 L 2.546875 1.363281 L 11.273438\n 1.363281 Z M 13.453125 2.726562 L 5.453125 2.726562 C 4.65625 2.726562 4 3.339844 4\n 4.089844 L 4 13.636719 C 4 14.386719 4.65625 15 5.453125 15 L 13.453125 15 C 14.253906\n 15 14.910156 14.386719 14.910156 13.636719 L 14.910156 4.089844 C 14.910156 3.339844\n 14.253906 2.726562 13.453125 2.726562 Z M 13.453125 13.636719 L 5.453125 13.636719 L\n 5.453125 4.089844 L 13.453125 4.089844 Z M 13.453125 13.636719 "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")]),_c('button',{staticClass:"function-btn d-print-none",attrs:{"onclick":"toggleCodeBlockWrap(this)"}},[_v("\n "),_c('div',{staticClass:"function-btn-body"},[_v("\n \n"),_c('svg',{attrs:{"xmlns":"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink","width":"18","height":"18","viewBox":"0 0 18 18","version":"1.1"}},[_v("\n "),_c('g',{attrs:{"id":"surface1"}},[_v("\n "),_c('path',{attrs:{"id":"path17964","d":"M 1.109375 0 L 1.109375 2.5351562 L 2.0410156 2.5351562 L\n 2.0410156 0.93164062 L 4.8203125 0.93164062 L 4.8203125 9.3222656 L 3.4746094\n 9.3222656 L 3.4746094 10.144531 L 8.8027344 10.144531 L 8.8027344 9.3222656 L\n 7.4492188 9.3222656 L 7.4492188 0.93164062 L 10.25 0.93164062 L 10.25 2.5351562 L\n 11.166016 2.5351562 L 11.166016 0 L 1.109375 0 z M 10.84375 5.1054688 L 10.84375\n 6.6074219 C 12.268027 6.6074219 13.40625 7.7456444 13.40625 9.1699219 C 13.40625\n 10.185673 12.827237 11.055036 11.978516 11.470703 L 11.978516 9.5175781 L 7.1386719\n 12.3125 L 11.978516 15.105469 L 11.978516 13.072266 C 13.66701 12.577757 14.910156\n 11.012746 14.910156 9.1699219 C 14.910156 6.9333638 13.080308 5.1054688 10.84375\n 5.1054688 z "}}),_v("\n ")]),_v("\n")]),_v("\n\n ")]),_v("\n ")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You can use empty "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags to mark code as not yours when RepoSense attribute the code to you incorrectly.")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Code generated by the IDE/framework,")]),_v(" should not be annotated as your own.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Code you modified in minor ways")]),_v(" e.g. adding a parameter. These should not be claimed as yours but you can mention these additional contributions in the Project Portfolio page if you want to claim credit for them.")])])])])])])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Reason 3:")]),_v(" Some commits should not be included in the authorship analysis "),_c('span',{staticClass:"dimmed"},[_v("e.g., you committed the code of a third party library by mistake")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("Remedy:")]),_v(" Let us know the hashes of the commits that need to be omitted from the analysis.")])]),_v(" "),_c('p',[_v("If none of the above works, please please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(" or contact us via "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("cs2103@comp.nus.edu.sg")]),_v(" so that we can advise you what to do.")]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("We recommend you ensure your code is RepoSense-compatible by v1.5")])])])],1)])])],1),_c('p'),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('span',{staticClass:"card-title"},[_c('div',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-info"},[_c('span',[_c('span',{staticClass:"far fa-question",attrs:{"aria-hidden":"true"}}),_v(" FAQ")])]),_v(" "),_c('span',[_v("What if someone took over a feature from another team member?")])])])])]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"secondary","seamless":""}},[_c('div',[_c('p',[_v("In terms of effort distribution, it's up to the team to tell us who did how much. Same goes for assigning bugs. So, it's fine for someone to take over a feature if the team is able to estimate the effort of each member, and they have a consensus on who will be responsible for bugs in that feature."),_c('br'),_v("\nFor code authorship, only one person can claim authorship of a line, and that person will be graded for the code quality of that line. By default, that will be the last person who edited it (as per Git data) but you can "),_c('a',{attrs:{"href":"/website/admin/tools.html#tool-reposense-for-authorship-tracking"}},[_v("override that behavior using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("@@author")]),_v(" tags")]),_v(".")])])])],1),_v(" "),_c('p')],1)]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("5")])],1)],1),_v(" "),_m(28),_v(" "),_m(29),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_m(30),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"success","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP → "),_c('strong',[_v("PE Phases")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('h4',{attrs:{"id":"pe-phase-1-bug-reporting"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 1: Bug Reporting")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-bug-reporting","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase, you will test the allocated product and report bugs, similar to PE-D. Done during week 13 lecture slot, and further divided into parts I, II, and III.")]),_c('p'),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-i-product-testing-60-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part I")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Product Testing [60 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-i-product-testing-60-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >50%, a substantial bonus if >70%) of your bugs are "),_c('em',[_c('strong',[_v("accepted as reported")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" of the bug match the values you chose initially and the bug is accepted by the team).")]),_v(" "),_c('p',[_v("Take away: Aim for the "),_c('em',[_v("correct")]),_v(" severity/type etc. rather than the one that gives you most marks, as the former can end up earning you more marks in the end anyway.")])]),_v(" "),_c('p',[_c('strong',[_v("Test the product and report bugs")]),_v(" as described below. You may report both product bugs and documentation bugs during this period.")]),_v(" "),_c('div',[_c('box',[_c('h5',{attrs:{"id":"testing-instructions-for-pe-and-pe-d"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_c('strong',[_v("Testing instructions for PE and PE-D")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing-instructions-for-pe-and-pe-d","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h6',{attrs:{"id":"a-launching-the-jar-file"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("a) Launching the JAR file")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#a-launching-the-jar-file","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Get the jar file to be tested:")])]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the "),_c('em',[_v("latest")]),_v(" JAR file from the team's releases page, if you haven't done this already.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Download the zip file from the given location (to be given to you at least a few hours before the PE), if you haven't done that already.")]),_v(" "),_c('li',[_v("The file is zipped using a two-part password.\n"),_c('ul',[_c('li',[_v("We will email you the second part in advance, via email (it's unique to each student). Keep it safe, and have it ready at the start of the PE.")]),_v(" "),_c('li',[_v("At the start of the PE, we'll give you the first part of the password (common to the whole class). Use combined password to unzip the file, which should give you another zip file with the name suffix "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("_inner.zip")]),_v(".")]),_v(" "),_c('li',[_v("Unzip that second zip file normally (no password required). That will give you a folder containing the JAR file to test and other PDF files needed for the PE. "),_c('mark',[_v("Warning: do not run the JAR file while it is still inside the zip file")]),_v("."),_c('br'),_v("\nIgnore the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("padding_file")]),_v(" found among the extracted files. "),_c('span',{staticClass:"dimmed"},[_v("Its only purpose is to mask the true size of the JAR file so that someone cannot guess which team they will be testing based on the zip file size.")])]),_v(" "),_c('li',[_v("Recommended: Try above steps using the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103/website-base/files/14849276/JohnDoe.zip"}},[_v("this sample zip file")]),_v(" if you wish (first part of the password: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-")]),_v(", second part: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password2")]),_v(" i.e., you should use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("password1-password2")]),_v(" to unzip it)."),_c('br'),_v("\nUse the JAR file inside it to try the steps given below as well, to confirm your computer's Java environment is as expected and can run PE jar files.")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('box',{attrs:{"type":"important","id":"tp-jar-testing-steps","seamless":""}},[_c('p',[_c('strong',[_c('strong',[_v("Steps for testing a tP JAR file")])]),_v(" (please follow closely)")]),_v(" "),_c('ol',[_c('li',[_v("Put the JAR file "),_c('mark',[_v("in an empty folder")]),_v(" in which the app is allowed to create files "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not use a write-protected folder)")]),_v("."),_c('br'),_v("\nIn rare cases, the team could have submitted a ZIP file instead of a JAR file. In that case, unzip that file into the target folder.")]),_v(" "),_c('li',[_v("Open a command window. Run the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -version")]),_v(" command to ensure you are using Java 17."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" Do this again even if you did this before, as your OS might have auto-updated the default Java version to a newer version.")]),_v(" "),_c('li',[_v("Check the UG to see if there are extra things you need to do before launching the JAR file "),_c('span',{staticClass:"dimmed"},[_v("e.g., download another file from somewhere")]),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" You may visit the team's "),_c('em',[_v("releases")]),_v(" page on GitHub if they have provided some extra files you need to download.")]),_v(" "),_c('li',[_v("Launch the jar file "),_c('mark',[_v("using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command")]),_v(" rather than double-clicking "),_c('span',{staticClass:"dimmed"},[_v("(reason: to ensure the jar file is using the same java version that you verified above)")]),_v(". Use double-clicking as a last resort."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" We strongly recommend surrounding the jar filename with double quotes, in case special characters in the filename causes the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to break."),_c('br'),_v("\ne.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar \"[CS2103-F18-1][Task Pro].jar\"")]),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-windows",attrs:{"aria-hidden":"true"}}),_v(" Windows users: use the DOS prompt or the PowerShell (not the WSL terminal) to run the JAR file."),_c('br'),_v(" "),_c('span',{staticClass:"fab fa-linux",attrs:{"aria-hidden":"true"}}),_v(" Linux users: If the JAR fails with an error labelled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Gdk-CRITICAL")]),_v(" (happens in Wayland display servers), try running it using "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GDK_BACKEND=x11 java -jar jar_file_name.jar")]),_v(" command instead.")])])]),_v(" "),_c('box',{attrs:{"type":"info"}},[_c('p',[_c('strong',[_c('span',{staticClass:"large"},[_v("If the product doesn't work at all:")])]),_v(" If the product fails catastrophically "),_c('span',{staticClass:"dimmed"},[_v("e.g., cannot even launch, or even the basic commands crash the app")]),_v(", do the following:")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Check the UG")]),_v(" of the team, to see if there are extra things you need to do before launching the JAR."),_c('br'),_v(" "),_c('strong',[_v("Confirm that you are using Java 17")]),_v(" and using the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("java -jar")]),_v(" command to run the JAR, as explained in points above.")]),_v(" "),_c('li',[_c('strong',[_v("Contact our head TA")]),_v(" via MS Teams (name: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Kim Hyeongcheol")]),_v(", NUSNET: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("dcskh")]),_v(") and give him"),_c('br'),_v("\n(a) "),_c('strong',[_v("a screenshot")]),_v(" of the error message, and"),_c('br'),_v("\n(b) "),_c('strong',[_v("your GitHub")]),_v(" username.")]),_v(" "),_c('li',[_c('strong',[_v("Wait for him to give you a fallback")]),_v(" team to test."),_c('br'),_v("\nContact the prof (via MS Teams) if you didn't get a response from Kim within 5 minutes.")]),_v(" "),_c('li',[_c('strong',[_v("Delete bug reports you submitted for the previous team")]),_v(" (if any), using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("You should not go back to testing the previous team")]),_v(" "),_c('em',[_v("after")]),_v(" you've been given a fallback team to test.")])])]),_v(" "),_c('h6',{attrs:{"id":"b-what-to-test"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("b) What to test")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#b-what-to-test","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Test the product "),_c('mark',[_v("based on the User Guide (PDF version)")]),_v(" available from their releases page on GitHub.")]),_v(" "),_c('li',[_v("Do "),_c('mark',[_c('em',[_v("system")]),_v(" testing first")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product work as specified by the documentation?")]),_v(". If there is time left, you can "),_c('mark',[_v("do "),_c('em',[_v("acceptance")]),_v(" testing as well")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("i.e., does the product solve the problem it claims to solve?")]),_v(".")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("Test "),_c('mark',[_v("based on the Developer Guide")]),_v(" (Appendix named "),_c('em',[_v("Instructions for Manual Testing")]),_v(") "),_c('mark',[_v("and the User Guide")]),_v(" PDF files.")]),_v(" The testing instructions in the Developer Guide can provide you some guidance but if you follow those instructions strictly, you are unlikely to find many bugs. You can deviate from the instructions to probe areas that are more likely to have bugs."),_c('br'),_v(" "),_c('strong',[_v("If the provided UG/DG PDF files have serious issues")]),_v(" (e.g., some parts seem to be missing), ask prof for permission to use the Web versions of UG/DG instead.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("The DG appendix named "),_c('em',[_v("Planned Enhancements")])]),_v(" (if it exists) gives some enhancements the team is planning for the near future. The feature flaws these enhancements address are 'known' -- reporting them will not earn you any credit."),_c('br'),_v("\nHowever, you can report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaws")]),_v(" bugs if you think these enhancements themselves are flawed/inadequate."),_c('br'),_v("\nYou can also report "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs if any of the enhancements in this list combines more than one enhancement.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You may do both "),_c('em',[_v("system testing")]),_v(" and "),_c('em',[_v("acceptance testing")])]),_v(".")])]),_v(" "),_c('li',[_c('p',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("Be careful when copying commands from the UG")]),_v(" (PDF version) to the app as some PDF viewers can affect the pasted text. If that happens, you might want to open the UG in a different PDF viewer."),_c('br'),_v("\nIf the command you copied spans multiple lines, check to ensure the line break did not mess up the copied command.")])])])])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"c-what-bugs-to-report"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("c) What bugs to report?")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#c-what-bugs-to-report","onclick":"event.stopPropagation()"}})]),_v(" "),_c('tabs',{attrs:{"active":"1"}},[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("PE Dry Run (at "),_c('strong',[_v("v1.5")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("You may report functionality bugs, UG bugs, and feature flaws.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])]),_v(" "),_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You can also post suggestions on how to improve the product."),_c('br'),_v(" "),_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" Be diplomatic when reporting bugs or suggesting improvements. For example, instead of criticising the current behavior, simply suggest alternatives to consider.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("PE (at "),_c('strong',[_v("v1.6")]),_v(")")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Report functionality bugs:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Functionality Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("functionality bugs")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior differs from the User Guide"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" A legitimate user behavior is not handled "),_c('span',{staticClass:"dimmed"},[_v("e.g. incorrect commands, extra parameters")]),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Behavior is not specified and differs from normal expectations "),_c('span',{staticClass:"dimmed"},[_v("e.g. error message does not match the error")]),_c('br')])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Do not post suggestions but if the product is missing a critical functionality that makes the product less useful to the intended user, it can be reported as a bug of type "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Type.FeatureFlaw")]),_v(". The dev team is allowed to reject bug reports framed as mere suggestions or/and lacking in a convincing justification as to why the omission or the current design of that functionality is problematic.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Feature Flaws")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_v("These are considered "),_c('em',[_v("feature flaws")]),_v(":"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" The feature does not solve the stated problem of the intended user i.e., the feature is 'incomplete'"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Hard-to-test features"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that don't fit well with the product"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Features that are not optimized enough for fast-typists or target users"),_c('br'),_v(" "),_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Violations of given "),_c('a',{attrs:{"href":"/website/admin/tp-constraints.html"}},[_v("project constraints")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("You may also report documentation bugs (UG bugs in particular) but keep in mind that there is another time (i.e., part II) set aside for reporting documentation bugs too.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p')])],1),_v(" "),_c('p'),_v(" "),_c('h6',{attrs:{"id":"d-how-to-report-bugs"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("d) How to report bugs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#d-how-to-report-bugs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" "),_c('strong',[_v("Post bugs as you find them")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., do not wait to post all bugs at the end)")]),_v(" because "),_c('span',{staticClass:"text-danger"},[_v("bug reports created/updated after the allocated time will not count.")]),_v(" Even minor updates (such as changing a label) outside the allowed time window will invalidate that bug.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("Launch CATcher, and login to the correct profile (when CATcher asks, consent to creating a new repo):\n"),_c('ul',[_c('li',[_v("PE Dry Run: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE Dry run")])]),_v(" "),_c('li',[_v("PE: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")])])])]),_v(" "),_c('li',[_v("Post bugs using CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("If you encounter a 'Failed to fetch' error")]),_v(" during CATcher login, try again. If it still fails, try a different network e.g., your mobile phone's hotspot.")]),_v(" "),_c('li',[_c('strong',[_v("If GitHub prompts you to 're-authorize' CATcher")]),_v(" (this happens if GitHub detects a rush of login requests from the same account), just re-authorize as requested.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"warning"}},[_c('p',[_v("Issues created for PE-D and PE need to be in a precise format for our grading scripts to work. Incorrectly-formatted responses will have to discarded. Therefore, you are "),_c('strong',[_c('span',{staticClass:"text-danger"},[_v("not allowed to use the GitHub interface for PE-D and PE activities, unless you have obtained our permission first")])]),_v(".")])])],1),_v(" "),_c('p',[_v("If you 'warmed up' CATcher for the PE earlier, you should already have a repo named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" in your GitHub account, created by CATcher during that warming up. If that is not the case, create a repo to post your bug reports as given in the panel below:")]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Creating a repo to post PE bugs")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',[_c('li',[_v("Create a public repo in your GitHub account with the name "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")])]),_v(" "),_c('li',[_v("Enable its issue tracker and add the following labels to it (the label names should be precisely as given).")])]),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1),_v(" "),_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Post bug reports in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("pe")]),_v(" repo.")]),_v(" "),_c('li',[_v("The whole description of the bug should be in the issue description i.e., "),_c('mark',[_v("do not add comments to the issue")]),_v(".")]),_v(" "),_c('li',[_v("Choose exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label and exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("*.severity")]),_v(" label.")])])],1)])],1)],1),_v(" "),_c('h6',{attrs:{"id":"e-bug-report-format"}},[_c('div',{staticClass:"text-white bg-secondary p-1"},[_v("e) Bug report format")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#e-bug-report-format","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Each bug should be a separate issue "),_c('span',{staticClass:"dimmed"},[_v("i.e., do not report multiple problems in the same bug report.")]),_c('br'),_v("\nIf there are multiple bugs in the same report, the dev team will select only one of the bugs in the report and discard the others.")]),_v(" "),_c('li',[_v("When reporting similar bugs, it is safer to report them as separate bugs because there is no penalty for reporting duplicates while putting multiple bugs in the same report can reduce your bug count (see the previous point). But as submitting multiple bug reports take extra time, if you are quite sure they will be considered as "),_c('em',[_v("duplicates")]),_v(" by the dev team later, you can report them together, to save time.")]),_v(" "),_c('li',[_v("Write good quality bug reports; "),_c('mark',[_v("poor quality or incorrect bug reports will not earn credit")]),_v("."),_c('br'),_v("\nRemember to give enough details for the receiving team to reproduce the bug. If the receiving team cannot reproduce the bug, you will not be able to get credit for it.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Reminder: Qualities of a good bug report")])]},proxy:true}])},[_v(" "),_c('div',[_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has a descriptive title")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("has enough details e.g., "),_c('mark',[_v("steps to reproduce, expected, actual, and screenshots")]),_v(".")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("severity/type labels chosen are not too far off")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("is written in a non-confrontational tone")])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticClass:"fas fa-check text-success",staticStyle:{"font-size":"unset","min-width":"16px","line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("​")]),_c('div',[_v("points out a potentially problematic behavior (or a good way to improve the product)")])])])])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" label to the bug report. Bug reports without a severity label are considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" (lower severity bugs earn lower credit)"),_c('br')])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_v("Assign exactly one "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" label to the issue.")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1)]),_v(" "),_c('ul',[_c('li',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("If you need to include "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(" symbols in your bug report")]),_v(", you can either use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\")]),_v(" to escape them (i.e., use "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("\\>")]),_v(" e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x \\< y")]),_v(" instead of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("x < y")]),_v(") or wrap it inside back-ticks."),_c('br'),_v("\nReason: CATcher and GitHub strips out content wrapped in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v(">")]),_v(", for security reasons.")])])],1)],1),_v(" "),_c('p',[_c('mark',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("When in doubt, choose the lower severity:")])]),_v(" If the severity of a bug seems to be smack in the "),_c('em',[_v("middle")]),_v(" of two severity levels, choose the lower severity (unless much closer to the higher one than the lower one).")]),_v(" "),_c('ul',[_c('li',[_v("Reason: The teaching team follow the same policy when adjudicating disputed severity levels in the last phase\nof the PE.")]),_v(" "),_c('li',[_v("As the tester, you might feel like you are throwing away marks by choosing a lower priority; but the lower\npriority has a lower risk of being disputed by the dev team, giving you (and the dev team)\na better chance of earning bonus marks for accuracy (which will be substantial)."),_c('br'),_v("\nTo make your case stronger, state in the bug report why you think the bug might even qualify for a higher severity, while you actually chose the lower one.")]),_v(" "),_c('li',[_v("In this section, there will be a "),_c('em',[_v("mass identity check")])])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":"","id":"identity-check-info","tags":"m--cs2103"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('strong',[_v("Mass identity check")])])]},proxy:true}])},[_v(" "),_c('p',[_v("When the invigilator announces an identity check,")]),_v(" "),_c('ol',[_c('li',[_v("remove mask (if any)")]),_v(" "),_c('li',[_v("turn towards the camera")]),_v(" "),_c('li',[_v("move closer to the camera (but do not adjust the camera position) -- no need to show the student card")]),_v(" "),_c('li',[_v("hold that pose until the invigilator has taken a screenshot and asks you to go back to the PE activity.")])]),_v(" "),_c('p',[_c('span',{staticClass:"text-danger"},[_v("Please comply quickly")]),_v(" as non-compliance can delay the PE for everyone. This is expected to take no more than 15 seconds.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Some students will be testing less/more buggy products than others? Isn't that unfair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("As each product is tested by 4-5 testers, after all PE bugs have been finalized, we know how 'buggy' each product is. We then use that information for calculating your PE-related marks. So, the marks are calibrated to match the bugginess of the product you tested.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested has hardly any bugs?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("If the total bugs found (by "),_c('em',[_v("all")]),_v(" testers) in a product is below a certain level, we compensate those testers by increasing the weightage given to PE-D performance, and their dev-testing results.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the product I tested is very buggy? Am I expected to find all those bugs")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No. Given the PE has only a short time, we don't expect you to find "),_c('em',[_v("all")]),_v(" bugs in the product. To get full marks, you only need to report a certain percentage of the bugs (e.g., half), or a certain quantity of bugs (the quantity also factors in the nature of the bug e.g., severity), whichever is lower.")])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-ii-evaluating-documents-30-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part II")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Evaluating Documents [30 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-ii-evaluating-documents-30-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use this slot mainly to report documentation bugs")]),_v(" (but you may report product bugs too). You may report bugs related to the UG and the DG."),_c('br'),_v("\nOnly the content of the UG/DG PDF files (not the online version) should be considered.")]),_v(" "),_c('li',[_c('strong',[_v("For each bug reported, cite evidence and justify.")]),_v(" For example, if you think the explanation of a feature is too brief, explain what information is missing and why the omission hinders the reader."),_c('br'),_v("\nDo not report bugs that are not contained within in the UG and DG pdf files (e.g., bugs in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(").")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible UG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → "),_c('strong',[_v("Possible DG Bugs")]),_v(" "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})]),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-flash",attrs:{"aria-hidden":"true"}})])])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered DG bugs (if they hinder the reader):")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Those given as possible UG bugs ...")])]},proxy:true}])},[_v(" "),_c('div',[_c('p',[_c('strong',[_v("These are considered UG bugs (if they hinder the reader):")]),_c('br')]),_v(" "),_c('div',[_c('span',{attrs:{"id":"visualsBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of visuals")]),_v(" "),_c('ul',[_c('li',[_v("Not enough visuals e.g., screenshots/diagrams")]),_v(" "),_c('li',[_v("The visuals are not well integrated to the explanation")]),_v(" "),_c('li',[_v("The visuals are unnecessarily repetitive e.g., same visual repeated with minor changes\n")])])]),_v(" "),_c('span',{attrs:{"id":"examplesBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Use of examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not enough or too many examples e.g., sample inputs/outputs\n")])])]),_v(" "),_c('span',{attrs:{"id":"explanationBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Explanations:")]),_v(" "),_c('ul',[_c('li',[_v("The target user for the product and/or the value proposition is not specified clearly.")]),_v(" "),_c('li',[_v("The explanation is too brief or unnecessarily long.")]),_v(" "),_c('li',[_v("The information is hard to understand for the target audience. e.g., using terms the reader might not know\n")])])]),_v(" "),_c('span',{attrs:{"id":"neatnessBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Neatness/correctness:")]),_v(" "),_c('ul',[_c('li',[_v("looks messy")]),_v(" "),_c('li',[_v("not well-formatted")]),_v(" "),_c('li',[_v("broken links, other inaccuracies, typos, etc.")]),_v(" "),_c('li',[_v("hard to read/understand")]),_v(" "),_c('li',[_v("unnecessary repetitions "),_c('span',{staticClass:"dimmed"},[_v("(i.e., hard to see what's similar and what's different)")])])])])])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"architectureDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Architecture:")]),_v(" "),_c('ul',[_c('li',[_v("Symbols used are not intuitive")]),_v(" "),_c('li',[_v("Indiscriminate use of double-headed arrows")]),_v(" "),_c('li',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("e.g., the sequence diagram showing interactions between main components")]},proxy:true}])},[_c('em',[_v("architecture-level")])]),_v(" diagrams contain lower-level details")],1),_v(" "),_c('li',[_v("Description given are not sufficiently high-level\n")])])]),_v(" "),_c('span',{attrs:{"id":"umlDiagramBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" UML diagrams:")]),_v(" "),_c('ul',[_c('li',[_v("Notation incorrect or not compliant with the notation covered in the course.")]),_v(" "),_c('li',[_v("Some other type of diagram used when a UML diagram would have worked just as well.")]),_v(" "),_c('li',[_v("The diagram used is not suitable for the purpose it is used.")]),_v(" "),_c('li',[_v("The diagram is too complicated.\n")])])]),_v(" "),_c('span',{attrs:{"id":"codeSnippetBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Code snippets:")]),_v(" "),_c('ul',[_c('li',[_v("Excessive use of code e.g., a large chunk of code is cited when a smaller extract would have sufficed.\n")])])]),_v(" "),_c('span',{attrs:{"id":"userStoryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in User Stories. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Incorrect format")]),_v(" "),_c('li',[_v("All three parts are not present")]),_v(" "),_c('li',[_v("The three parts do not match with each other")]),_v(" "),_c('li',[_v("Important user stories missing\n")])])]),_v(" "),_c('span',{attrs:{"tags":"m--cs2103","id":"useCaseBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Use Cases. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Important use cases missing "),_c('span',{staticClass:"dimmed"},[_v("(a use case is "),_c('em',[_v("important")]),_v(" if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)")])]),_v(" "),_c('li',[_v("Formatting/notational errors")]),_v(" "),_c('li',[_v("Incorrect step numbering")]),_v(" "),_c('li',[_v("Unnecessary UI details mentioned")]),_v(" "),_c('li',[_v("Missing/unnecessary steps")]),_v(" "),_c('li',[_v("Missing extensions\n")])])]),_v(" "),_c('span',{attrs:{"id":"nfrBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in NFRs. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Not really a "),_c('em',[_v("Non-Functional")]),_v(" Requirement")]),_v(" "),_c('li',[_v("Not scoped clearly (i.e., hard to decide when it has been met)")]),_v(" "),_c('li',[_v("Not reasonably achievable")]),_v(" "),_c('li',[_v("Highly relevant NFRs missing\n")])])]),_v(" "),_c('span',{attrs:{"id":"glossaryBugs"}},[_c('p',[_c('span',{staticClass:"fas fa-bug",attrs:{"aria-hidden":"true"}}),_v(" Problems in Glossary. Examples:")]),_v(" "),_c('ul',[_c('li',[_v("Unnecessary terms included")]),_v(" "),_c('li',[_v("Important terms missing\n")])])])],1)])],1),_c('p'),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_c('strong',[_v("You may visit the team's project on GitHub during this portion")]),_v(", for the purpose of verifying the accuracy of documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., to check if a diagram matches the code")]),_v(". You are also allowed to download and open the team's code in a code editor.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("You "),_c('em',[_v("may")]),_v(" report grammar issues")]),_v(" as bugs but note that minor grammar issues that don't hinder the reader are allowed to be categorized as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" (by the receiving team) -- such bugs earn only small amount or credit for the tester (hence, do not waste time reporting too many minor grammar errors).")])])]),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iii-overall-evaluation-15-minutes"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part III")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Overall Evaluation [15 minutes]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iii-overall-evaluation-15-minutes","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("To be submitted via TEAMMATES. You are expected to complete this during the PE session itself, but "),_c('mark',[_v("you have until the end of the day to submit (or revise) your submissions")]),_v("."),_c('br'),_v(" "),_c('strong',[_v("If you have to valid reason to leave the PE early")]),_v(" (e.g., having another exam right after the PE), you may leave after part II has ended and do part III later -- but note that if you fail to submit this by the hard deadline (i.e., end of the day), you will receive an "),_c('span',{staticClass:"text-danger"},[_v("automatic penalty")]),_v(".")]),_v(" "),_c('li',[_v("The TEAMMATES email containing the submission link should have reached you the day before the PE. If you didn't receive it by then, you can request it to be resent from "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("this page")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("If TEAMMATES submission page is slow/fails to load")]),_v(" (all of you accessing it at the same time is likely to overload the server), wait 3-5 minutes and try again. "),_c('span',{staticClass:"text-danger"},[_v("Do not refresh the page repeatedly")]),_v(" as that will overload the server even more, and recovery can take even longer.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('panel',{staticClass:"algolia-no-index",attrs:{"peek":"","panelId":"important-questions-included-in-the-evaluation"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"important-questions-included-in-the-evaluation"}},[_v("Important questions included in the evaluation"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#important-questions-included-in-the-evaluation","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',{attrs:{"id":"projectGrading-featureFit-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Quality of the product design,")]),_c('br'),_v("\nEvaluate based on the User Guide and the actual product behavior.")],1),_v(" "),_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Criterion")]),_v(" "),_c('th',[_v("Unable to judge")]),_v(" "),_c('th',[_v("Low")]),_v(" "),_c('th',[_v("Medium")]),_v(" "),_c('th',[_v("High")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("target user")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_v("Clearly specified and narrowed down appropriately")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("value proposition")])]),_v(" "),_c('td',[_v("Not specified")]),_v(" "),_c('td',[_v("The value to target user is low. App is not worth using")]),_v(" "),_c('td',[_v("Some small group of target users might find the app worth using")]),_v(" "),_c('td',[_v("Most of the target users are likely to find the app worth using")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("optimized for target user")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Not enough focus for CLI users")]),_v(" "),_c('td',[_v("Mostly CLI-based, but cumbersome to use most of the time")]),_v(" "),_c('td',[_v("Feels like a fast typist can be more productive with the app, compared to an equivalent GUI app without a CLI")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("feature-fit")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("Many of the features don't fit with others")]),_v(" "),_c('td',[_v("Most features fit together but a few may be possible misfits")]),_v(" "),_c('td',[_v("All features fit together to for a cohesive whole")])])])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-userGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AddressBook-Level3 (AB3), the overall quality of the UG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose, from the perspective of a target user.\nFor reference, the AB3 UG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"c7200"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"c7200","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-devGuide-instructions"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Compared to AB3, the overall quality of the DG you evaluated is,")]),_c('br'),_v("\nEvaluate based on fit-for-purpose from the perspective of a new team member trying to understand the product's internal design by reading the DG.\nFor reference, the AB3 DG is "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/DeveloperGuide.html"}},[_v("here")]),_v("."),_c('br')],1),_v(" "),_c('ul',{staticClass:"radio-list",attrs:{"radio-group":"1eb6e"}},[_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Significantly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Slightly lower")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Similar")])]),_v(" "),_c('li',{staticClass:"radio-list-item"},[_c('label',[_c('input',{staticClass:"radio-list-input",attrs:{"name":"1eb6e","type":"radio"}}),_v(" Higher")])])])]),_v(" "),_c('p'),_v(" "),_c('div',{attrs:{"id":"projectGrading-effort-instructions"}},[_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("If the implementation effort required to create AB3 from scratch is 10, the estimated implementation effort of this team is,")]),_v(" ["),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("0")]),_v(".."),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("20")]),_v("] e.g., if you give "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(", that means the team's effort is about 50% of that spent on creating AB3. We expect most typical teams to score near to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("5")]),_v(".")],1),_v(" "),_c('ul',[_c('li',[_v("Do read the DG appendix named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Effort")]),_v(", if any.")]),_v(" "),_c('li',[_c('mark',[_v("Consider implementation work only (i.e., exclude testing, documentation, project management etc.)")])]),_v(" "),_c('li',[_v("Do not give a high value just "),_c('em',[_v("to be nice")]),_v(". "),_c('mark',[_v("Your responses will be used to evaluate your effort estimation skills.")])]),_v(" "),_c('li',[_v("Do "),_c('mark',[_v("not consider the team size")]),_v(" when deciding this rating. We'll factor in the team size later.")])])])]),_v(" "),_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("[Optional] Concerns or any noteworthy observations about the product you evaluated")])],1),_v(" "),_c('div',{attrs:{"tags":"m--cs2103"}},[_c('p',[_c('thumbnail',{attrs:{"circle":"","background":"#28a745","font-color":"white","size":"25"}},[_c('strong',[_v("Q")])]),_v(" "),_c('strong',[_v("Finally, what did you like about the product you tested?")])],1)])]),_v(" "),_c('p')],1),_v(" "),_c('hr',{staticClass:"border-success"}),_v(" "),_c('h5',{attrs:{"id":"pe-phase-1-part-iv-trimming-bugs-half-a-day"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE Phase 1 - Part IV")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Trimming bugs [~half a day]")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-1-part-iv-trimming-bugs-half-a-day","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("This segment gives testers a second chance revisit their bug reports, and choose upto 7 bugs that they wish to send to the dev team.")]),_v(" They will be allowed to change bug type/severity too (but will not be allowed to change bug title or the description)."),_c('br'),_v("\nObjectives:\n"),_c('ul',[_c('li',[_v("Testers can correct their type/severity choices in case they chose incorrectly during the PE due to time pressure.")]),_v(" "),_c('li',[_v("Testers get a chance to withdraw lower impact (or uncertain) bugs so that there is less work for the dev team during the next phase.")])])]),_v(" "),_c('li',[_c('strong',[_v("Procedure:")]),_v(" coming soon ...")])]),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-2-developer-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 2: Developer Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-2-developer-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("This phase is for you to respond to the bug reports you received. Done during Sun-Mon after PE ")]),_c('p'),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Mon, Nov 18th 2359")])]),_v(" "),_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_c('strong',[_v("Yes, that can be better!")])]),_v(" For each bug report you receive, if you think a software engineer who takes pride in their own work would say \"yes, that can be better!\", accept it graciously, even if you can come up with "),_c('em',[_v("some")]),_v(" argument to justify the current behavior. "),_c('br'),_v("\nEven when you still want to defend the current behavior, instead of pretending that the behavior was a deliberate choice to begin with, you can say something like,")]),_v(" "),_c('blockquote',[_c('p',[_v("\"Thanks for raising this. Indeed, it didn't occur to us. But now that we have thought about it, we still feel ...\"")])]),_v(" "),_c('p',[_c('strong',[_c('em',[_v("Some")]),_v(" bugs are 'expected'.")]),_v(" Given the short time you had for the tP and your inexperience in SE team projects, this work is not expected to be totally bug free. The grading scheme factors that in already -- i.e., your grade will not suffer if you accept a few bugs in this phase.")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-success"},[_v("Bonus marks for high accuracy rates!")])]),_v(" "),_c('p',[_v("You will receive bonus marks if a high percentage (e.g., some bonus if >60% substantial bonus if >80%) of bugs are "),_c('em',[_c('strong',[_v("accepted as triaged")])]),_v(" (i.e., the eventual "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(" of the bug match the ones you chose).")])]),_v(" "),_c('box',{attrs:{"type":"important","seamless":""}},[_c('p',[_c('strong',{staticClass:"text-danger"},[_v("It's not bargaining!")])]),_v(" "),_c('p',[_v("When the tester and the dev team cannot reach a consensus, the teaching team will select either the dev team position or the tester position as the final state of the bug, whichever appear to be closer to being reasonable. "),_c('span',{staticClass:"text-danger"},[_v("The teaching team will not come up with our own position, or choose a middle ground.")])]),_v(" "),_c('p',[_v("Hence, do not be tempted to argue for an unreasonable position in the hope that you'll receive something less than asked but still in your favor e.g., if the tester chose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" but you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(", don't argue for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" in the hope that the teaching team will decide a middle ground of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(". It's more likely that the teaching team will choose the tester's position as yours seems unreasonable.")]),_v(" "),_c('p',[_v("More importantly, this is not a bargaining between two parties; it's "),_c('strong',[_v("an attempt to determine the true nature of the bug, and your ability to do so (which is an important skill)")]),_v(".")])]),_v(" "),_c('box',{attrs:{"type":"tip","seamless":""}},[_c('p',[_c('mark',{staticClass:"text-success"},[_c('strong',[_v("Favor "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" over "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")])])])]),_v(" "),_c('p',[_v("If there is even the slightest chance that the change directly suggested (or indirectly hinted at) by a bug report is an improvement that you "),_c('em',[_v("might")]),_v(" consider doing in a future version of the product, choose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v("."),_c('br'),_v("\nChoose "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" only for bug reports that are clearly incorrect (e.g., the tester misunderstood something)."),_c('br'),_v("\nAccordingly, it is typical a team to have a lot more "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs and very few "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Reject")]),_v(" bugs.")]),_v(" "),_c('p',[_v("Note that "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" bugs earn a small amount of credit for the tester without any penalty for the dev team, unless there is an unusually high number of such bugs for a team.")])]),_v(" "),_c('p',[_v("Bug reviewing is recommended to be done as a team as some of the decisions need team consensus.")]),_v(" "),_c('box',[_c('p',[_c('strong',[_v("Instructions for Reviewing Bug Reports")])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Don't freak out if there are a lot of bug reports.")]),_v(" Many can be duplicates and some can be "),_c('em',[_v("false positives")]),_v(". In any case, we anticipate that all of these products will have some bugs and our penalty for bugs is not harsh. Furthermore, it depends on the severity of the bug. Some bug may not even be penalized.")]),_v(" "),_c('li',[_c('strong',[_v("Nit-picking is a good sign")]),_v(": If you receive a lot of nit-picking type of bugs that make you roll your eyes, it means testers were unable to find more serious bugs. That's a good thing.")]),_v(" "),_c('li',[_c('strong',[_v("Not exactly zero-sum")]),_v(": As mentioned earlier, the penalty for having a specific bug is not the same as the reward for reporting that bug (it's not a "),_c('em',[_v("zero-sum")]),_v(" game). For example, the reward for testers will be higher (because we don't expect the products to have that many bugs after they have gone through so much prior testing)")])]),_v(" "),_c('box',{attrs:{"type":"info","seamless":""}},[_c('p',[_c('strong',[_v("Penalty for a minor bug (e.g., "),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("an indicative value only; the actual value depends on the severity, type, and the number of assignees")]},proxy:true}])},[_v("-0.15")]),_v(") is unlikely to make a difference in your final grade")],1),_v(", especially given that the penalty applies only if you have more than a certain amount of bugs."),_c('br')]),_v(" "),_c('p',[_v("For example, in a typical case a developer might be assigned 5+ "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" bugs before the penalty even starts affecting their marks.")]),_v(" "),_c('p',[_v("Accordingly, we hope you'll "),_c('strong',[_v("accept bug reports graciously")]),_v(" (rather than fight tooth-and-nail to reject "),_c('em',[_v("every")]),_v(" bug report received) if you think the bug is within the ballpark of 'reasonable'. Those minor bugs are really not worth stressing/fighting over.")])]),_v(" "),_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('box',{attrs:{"type":"info"},scopedSlots:_u([{key:"icon",fn:function(){return [_c('span',{staticClass:"fas fa-hard-hat",attrs:{"aria-hidden":"true"}})]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("CATcher does not come with a UG, but the UI is fairly intuitive (there are tool tips too). Do post in the forum if you need any guidance with its usage.")]),_v(" "),_c('li',[_v("Tip: If you think others might be editing the same issues at the same time, use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Sync")]),_v(" button at the top to force-sync your view with the latest data from GitHub.")])])]),_v(" "),_c('ul',[_c('li',[_v("Go to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher/"}},[_v("CATcher Web app")]),_v(", and login to the profile "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(". It will show all the bugs assigned to your team, divided into three sections:\n"),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" - Issues that your team has not processed yet.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Responded")]),_v(" - Your job is to get all issues to this category.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Faulty Issues")]),_v(" - e.g., Bugs marked as duplicates of each other, or causing circular "),_c('em',[_v("duplicate")]),_v(" relationships. Fix the problem given so that no issues remain in this category.")])])]),_v(" "),_c('li',[_v("Respond to the bug reports shown.")])])],1),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',{attrs:{"id":"warning-use-catcher"}},[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug seems to be for a different product")]),_v(" (i.e. wrongly assigned to your team), let us know ASAP.")]),_v(" "),_c('li',[_c('strong',[_v("If the bug is reported multiple times")]),_v(",\n"),_c('ul',[_c('li',[_v("Mark "),_c('span',{staticClass:"text-danger"},[_v("all copies "),_c('mark',[_v("EXCEPT one")])]),_v(" as duplicates of the one left out (let's call that one the "),_c('em',[_v("original")]),_v(") using the "),_c('span',{staticClass:"fas fa-check-square",attrs:{"aria-hidden":"true"}}),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A Duplicate of")]),_v(" tick box.")]),_v(" "),_c('li',[_v("For each group of duplicates, all duplicates should point to one "),_c('em',[_v("original")]),_v(" i.e., no multiple levels of duplicates, and no cyclical duplication relationships.")]),_v(" "),_c('li',[_v("If the duplication status is eventually accepted, all duplicates will be assumed to have inherited the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(" from the "),_c('em',[_v("original")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("If you cannot reproduce the bug based on the info given by the tester")]),_v(" you are still expected to make a "),_c('em',[_v("reasonable attempt")]),_v(" to go beyond the information provided by the tester to reproduce the bug, if there is clear evidence of something wrong."),_c('br'),_v("\nFor example, the screenshot in the bug report clearly shows an error message that should not appear, but you can't reproduce the error message based on the info given by the tester. Perhaps the error was caused by something else the tester did although the tester didn't realize it is connected to the error. In this case, based on the error message, you might be in a better position to figure out the real cause of the error. If you don't, the decision can go against you in a later phase if either the tester or the moderator figures out how to reproduce the error and the moderator decides that it is something you should have been able to figure out yourself.")])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Apply one of these labels")]),_v(" (if missing, we assign: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(")")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',[_c('p',[_c('strong',[_v("Response")]),_v(" Labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(": You accept it as a valid bug.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(": It is a valid issue, but fixing it is less important than the work done in the current version of the product "),_c('span',{staticClass:"dimmed"},[_v("e.g., it was not related to features delivered in v1.6 or lower priority than the work already done in v1.6")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Rejected")]),_v(": What tester treated as a bug is in fact the "),_c('em',[_v("expected")]),_v(" and "),_c('em',[_v("correct")]),_v(" behavior (from the user's point of view), or the tester was mistaken in some other way. "),_c('span',{staticClass:"dimmed"},[_v("Note: Disagreement with the bug severity/type given by the tester is not a valid reason to reject the bug.")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.CannotReproduce")]),_v(": You are unable to reproduce the behavior reported in the bug after multiple tries.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.IssueUnclear")]),_v(": The issue description is not clear. Don't post comments asking the tester to give more info. The tester will not be able to see those comments because the bug reports are anonymous.")])]),_v(" "),_c('p',[_v("Only the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.Accepted")]),_v(" bugs are counted against the dev team. While "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" are not counted against the dev team, they can earn a small amount of consolation marks for the tester. The other three do not affect marks of either the dev team or the tester, except when calculating bonus marks for accuracy.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original bug type assigned to the bug")]),_v(", you may change it to the correct type.")])]),_v(" "),_c('div',{staticClass:"indented",attrs:{"id":"type-labels"}},[_c('box',[_c('p',[_c('strong',[_v("Type")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(": A functionality does not work as specified/expected.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(": Some functionality missing from a feature delivered in v1.6 in a way that the feature becomes less useful to the intended target user for "),_c('em',[_v("normal")]),_v(" usage. i.e., the feature is not 'complete'. In other words, an acceptance-testing bug that falls within the scope of v1.6 features."),_c('br'),_v("\nThese issues are counted against the "),_c('em',[_v("product design")]),_v(" aspect of the project. Therefore, other design problems (e.g., low testability, mismatches to the target user/problem, project constraint violations etc.) can be put in this category as well."),_c('br'),_v("\nFeatures that work as specified by the UG but "),_c('em',[_v("should have been designed to work differently")]),_v(" (from the end-user's point of view) fall in this category too.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(": A flaw in the documentation "),_c('span',{staticClass:"dimmed"},[_v("e.g., a missing step, a wrong instruction, typos")])])])])],1),_v(" "),_c('p',[_c('strong',[_v("If a bug fits multiple types "),_c('em',[_v("equally")]),_v(" well")]),_v(", the team is free to choose the one they think the best match, but keep the type chosen by the tester if it is one of the types that fits the bug equally well.")]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you disagree with the original severity assigned to the bug")]),_v(", you may change it to the correct level.")])]),_v(" "),_c('div',{staticClass:"indented"},[_c('div',[_c('box',[_c('p',[_c('strong',[_v("Bug Severity")]),_v(" labels:")]),_v(" "),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" : A flaw that is purely cosmetic and does not affect usage e.g., a typo/spacing/layout/color/font issues in the docs or the UI that doesn't affect usage.\n"),_c('mark',[_v("Only cosmetic problems should have this label")]),_v(".")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" : A flaw that is unlikely to affect normal operations of the product. Appears only in very rare situations and causes a minor inconvenience only.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" : A flaw that causes occasional inconvenience to some users, but they can continue to use the product.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" : A flaw that affects most users and causes major problems for users. i.e., only problems that make the product "),_c('mark',[_v("almost unusable for most users")]),_v(" should have this label.")])]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" When applying for documentation bugs, replace "),_c('em',[_v("user")]),_v(" with "),_c('em',[_v("reader")]),_v(".")])])],1)]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you need the teaching team's inputs when deciding on a bug")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., if you are not sure if the UML notation is correct)")]),_v(", post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(". Remember to "),_c('mark',[_v("quote the issue number shown in CATcher")]),_v(" (it appears at the end of the issue title)."),_c('br'),_v("\nKeep in mind that the bug triaging accuracy affects your marks, and therefore, the teaching team prefers not to dictate a specific response, type, or severity for a particular bug report (i.e., that decision should be yours). Nevertheless, we can provide some general comments relevant to the issue at hand. Additionally, we encourage other students to chime in with their opinions, as such discussions have learning value.")])]),_v(" "),_c('div',{staticClass:"indented-level1",attrs:{"id":"additionalGuidelinesForBugTriaging"}},[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-2"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-2"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-2"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-2"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Decide who should take responsibility for the bug")]),_v(". Use the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Assignees")]),_v(" field to assign the issue to that person(s). There is no need to actually fix the bug though. It's simply an indication/acceptance of responsibility. "),_c('strong',[_v("If there is no assignee, we will distribute the penalty for that bug (if any) equally among all team members")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("e.g., if the penalty is -0.4 and there are 4 members, each member will be penalized -0.1")]),_v(".\n"),_c('ul',[_c('li',[_v("If it is not easy to decide the assignee(s), we recommend (but not enforce) that the feature owner should be assigned bugs related to the feature, Reason: The feature owner should have defended the feature against bugs using automated tests and defensive coding techniques.")]),_v(" "),_c('li',[_v("It is also fine to not assign a bug to anyone, in which case the penalty will be divided equally among team members.")])])])]),_v(" "),_c('p'),_v(" "),_c('ul',[_c('li',[_c('p',[_v("As far as possible, "),_c('mark',[_c('strong',[_v("choose the correct "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.*")]),_v(", assignees, and duplicate status even for bugs you are not accepting")])]),_v(". Reason: your "),_c('em',[_v("non-acceptance")]),_v(" may be rejected in a later phase, in which case we need to grade it as an accepted bug."),_c('br'),_v(" "),_c('strong',[_v("If a bug's 'duplicate' status was rejected later")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(i.e., the tester says it is not really a duplicate and the teaching team agrees with the tester)")]),_v(", it will inherit the response/type/severity/assignees from the 'original' bug that it was claimed to be a duplicate of.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Justify your response.")]),_v(" For all the following cases, "),_c('mark',[_v("you must add a comment justifying your stance")]),_v(". Testers will get to respond to all those cases and will be considered by the teaching team in later phases (when resolving disputed bug reports)."),_c('br'),_v(" "),_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" If you don't provide a justification and the tester disagrees with your decision, the teaching team will have no choice but to rule in favor of the tester.")]),_v(" "),_c('ul',[_c('li',[_v("downgrading severity")]),_v(" "),_c('li',[_v("non-acceptance of a bug")]),_v(" "),_c('li',[_v("changing the bug type")]),_v(" "),_c('li',[_v("non-obvious duplicate")])])])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Do we need to justify even if we accept the bug "),_c('em',[_v("as is")]),_v("?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("No need to provide a justification if you accept the bug without "),_c('em',[_v("any")]),_v(" changes to it.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: So, those who write more code will be hit with more bugs? How's that fair?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Penalty for bugs is applied based on bug "),_c('em',[_v("density")]),_v(", not bug count. For example, if Ann contributed twice as much implementation effort as Tom, and was assigned twice as many bugs as Tom, both will receive similar penalties, as both had similar bug densities.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug is real but the tester used the wrong label (e.g., used the wrong "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.*")]),_v("). Can we reject that bug?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("A bug is a bug irrespective of the label used. Instead of rejecting, rectify the label.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the bug the tester reported is legit but the expected behavior tester suggested is not correct?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You should accept the bug but state that you disagree with the expected/suggested behavior. Reason: the main job of the tester is to detect bugs; suggesting a solution is optional.")])]),_v(" "),_c('p')],1),_v(" "),_c('ul',[_c('li',[_v("You can also refer to the below guidelines:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-2"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-2","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-3-tester-response"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 3: Tester Response")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-3-tester-response","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase you will receive the dev teams response to the bugs you reported, and will give your own counter response (if needed). Done during Tue-Thu after PE")]),_c('p'),_v(" "),_c('p',[_c('strong',[_v("Start:")]),_v(" Within 1 day after Phase 2 ends."),_c('br')]),_v(" "),_c('div',{staticClass:"indented"},[_c('p',[_c('span',{staticStyle:{"color":"red"}},[_c('big',[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-exclamation-sign",attrs:{"aria-hidden":"true"}})])])],1),_v(" While you are waiting for Phase 3 to start, comments will be added to the bug reports in your "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/pe")]),_v(" repo, to indicate the response each received from the receiving team. "),_c('span',{staticClass:"text-danger"},[_v("Please do not edit any of those comments or reply to them via the GitHub interface.")]),_v(" Doing so can invalidate them, in which case the grading script will assume that you agree with the dev team's response. Instead, wait till the start of the Phase 3 is announced, after which you should use CATcher to respond.")])]),_v(" "),_c('p',[_c('mark',[_c('strong',[_v("Deadline:")]),_v(" Thu, Nov 21st 2359")])]),_v(" "),_c('ul',[_c('li',[_v("In this phase you will get to state whether you agree or disagree with the dev team's response to the bugs you reported. If a bug reported has been subjected to any of the below by the dev team, you can record your objections and the reason for the objection.\n"),_c('ul',[_c('li',[_v("not accepted")]),_v(" "),_c('li',[_v("severity downgraded")]),_v(" "),_c('li',[_v("bug type changed")]),_v(" "),_c('li',[_v("bug flagged as duplicate "),_c('span',{staticClass:"dimmed"},[_v("(Note that you still get credit for bugs flagged as duplicates, unless you reported both bugs yourself. Nevertheless, it is in your interest to object to incorrect duplicate flags because when a bug is reported by more testers, it will be considered an 'obvious' bug and will earn slightly less credit than otherwise)")])])])])]),_v(" "),_c('div',{staticClass:"indented"},[_c('box',{attrs:{"type":"important"}},[_c('p',[_c('strong',[_v("Don't feel upset if the dev team did not totally agree")]),_v(" with most of the bugs you reported. That is to be expected, given you had very short time to make those bug decisions while the dev team had a lot more time to deliberate about them. Some may have given unreasonable (in your opinion) arguments against your bug reports; not to worry, just give your counter-arguments and leave it to the teaching team to decide (in the next phase) which position is more reasonable.")]),_v(" "),_c('p',[_v("However, "),_c('mark',[_v("if the dev team's argument is not too far from 'reasonable', "),_c('strong',[_v("it may be better to agree than disagree")])]),_v("."),_c('br'),_v("\nReason: an incorrect counterargument at this phase will lower your "),_c('em',[_v("accuracy")]),_v(" more than an incorrect decision made during the testing phase (because you now have more time to think about the bug) i.e., changing your position after you had more time to think of it and after having seen more information is encouraged, compared to sticking to your initial position 'no matter what'.")])])],1),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If you would like to revise your own initial type/severity")]),_v(" in response to the team's inputs, you can state that in your explanation "),_c('span',{staticClass:"dimmed"},[_v("e.g., you rated the bug "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" and the team changed it to "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" but now you think it should be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")])]),_v(" (do not change the original labels yourself though).")]),_v(" "),_c('li',[_v("You can also refer to the below guidelines, mentioned during the previous phase as well:")])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" PE → Phase 2 → Additional Guidelines for Bug Triaging")])]},proxy:true}])},[_v(" "),_c('div',[_c('panel',{attrs:{"type":"info","expanded":"","panelId":"guidelines-for-bug-triaging-2"},scopedSlots:_u([{key:"header",fn:function(){return [_c('h5',{attrs:{"id":"guidelines-for-bug-triaging-2"}},[_v("Guidelines for bug triaging"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#guidelines-for-bug-triaging-2","onclick":"event.stopPropagation()"}})])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"general-3"}},[_v("General:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#general-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("If a bug report contains multiple bugs")]),_v(" (i.e., despite instructions to the contrary, a tester included multiple bugs in a single bug report), you have to choose one bug and ignore the others. If there are valid bugs, choose from valid bugs. Among the choices available, choose the one with the highest severity (in your opinion). In your response, mention which bug you chose.")]),_v(" "),_c('li',[_c('strong',[_v("If a bug report has broken image links")]),_v(", check with the prof instead of rejecting them outright using the missing image as an excuse -- the missing image may be due to a technical problem of CATcher.")]),_v(" "),_c('li',[_c('strong',[_v("What bugs can be considered duplicates?")]),_v(" It is up to the dev team to prove conclusively that a bug is a duplicate. If the proof is not convincing enough, they will be considered as 'not duplicates'. Only the following cases can be considered duplicates:"),_c('br'),_v("\n(a) The exact same bug reported multiple times."),_c('br'),_v("\n(b) Multiple buggy behaviors that are actually caused by the same defect and "),_c('mark',[_v("cannot be fixed independently")]),_v(" (i.e., fixing one fixes the others automatically)."),_c('br'),_v(" "),_c('br'),_v("\nIn real projects, similar bugs (e.g., the same typo in multiple places) tend to get combined into a single issue/PR; in the PE, we have to keep independently-fixable things as separate bugs, to avoid complications in grading. After all, having the same typo in two places is not exactly the same as having it in only one place."),_c('br'),_v("\nIf an independently-fixable yet similar problem appears in more than five distinct places, get our permission to combine them as one bug (in which case we'll require you to increase the severity to match the frequency of the bug).")])]),_v(" "),_c('div',{attrs:{"id":"how-to-prove-out-of-scope"}},[_c('ul',[_c('li',[_c('strong',[_v("How to prove that something is "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")])]),_v(": In general, a flaw (e.g., a missing feature, a suboptimal design of a feature, a known bug) can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(" if rectifying it is less important (based on the value/effort considerations) than the work that has been done already (because it is fine to delay lower priority work until future iterations)."),_c('br'),_v("\nIn addition, the following (at least one) need to be satisfied:\n"),_c('ul',[_c('li',[_v("The UG specifies it as not supported or coming in a future version.")]),_v(" "),_c('li',[_v("The user cannot attempt to use the missing feature or when the user does so, the software fails gracefully, possibly with a suitable error message i.e., the software should not crash.")])])])]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug qualifies for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(", the dev team will not be penalized, but the bug reporter will earn a small amount of credit for reporting it.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If a bug matches an enhancement listed in the 'Appendix: Planned Enhancements' of the DG, that bug can be rejected (the tester should not have reported it at all).")])])]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Even bugs inherited from AB3 are counted")]),_v(". As the current development team, you are responsible for all bugs in the product, irrespective of when it was created.")])]),_v(" "),_c('div',{attrs:{"id":"triaging-functionality-bugs"}},[_c('h5',{attrs:{"id":"functionality-bugs-3"}},[_v("Functionality bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#functionality-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Problems caused by "),_c('em',[_v("extreme")]),_v(" user behaviors")]),_v(":\n"),_c('ul',[_c('li',[_v("If the problem happens only in case of a deliberate sabotage "),_c('span',{staticClass:"dimmed"},[_v("(e.g., user entered a 30-digit telephone number)")]),_v(", it will not be considered a bug (in our context)."),_c('br'),_v("\nHowever, if it is possible for a user mistake to cause such inputs "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user missed out typing the space between two parameters)")]),_v(", they should not cause harm e.g., such mistakes should not crash the app, corrupt the data, or make it unusable.")]),_v(" "),_c('li',[_v("Problems caused by integer overflows -- apply the guideline in the previous point.")])])]),_v(" "),_c('li',[_c('strong',[_v("Problems caused by very long input values")]),_v(": When a user input is unusually long "),_c('span',{staticClass:"dimmed"},[_v("e.g., a very long name, a very large number")]),_v(", it can cause problems e.g., the UI layout can get messed up, some part of it might get cut off."),_c('br'),_v(" "),_c('ul',[_c('li',[_v("These can be considered cosmetic issues (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(") of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" (or of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(", depending on the nature of the problem)."),_c('br'),_v("\nHowever, if the problem can hinder the user "),_c('span',{staticClass:"dimmed"},[_v("(e.g., not seeing the last part of a very long name might not hinder the user, but it does hinder the user if only the first few characters of the name is shown)")]),_v(", the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_v("It is also fine to restrict the size/length of inputs as long as the limits are reasonable. For example, limiting the phone number to 8 digits is not reasonable unless you are targeting users whose telephone numbers are "),_c('em',[_v("guaranteed")]),_v(" to be not more than 8 digits.")])])]),_v(" "),_c('li',[_c('strong',[_v("Use of symbols in input values")]),_v(": It is acceptable to disallow certain characters in input values if there is a justification (e.g., because using those symbols in an input value makes the command harder to parse), but they can still be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(" bugs if they cause inconvenience to the user. For example, disallowing "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("s/o")]),_v(" in a person name because "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("/")]),_v(" is used as a command delimiter can cause a major problem if the input is expected to match the legal name of the person.")]),_v(" "),_c('li',[_c('strong',[_v("Mismatch between the UG and the feature")]),_v(": If the feature behavior needs to be changed, it is either a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(". But if it is the UG that needs to be updated, it is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Handling manual edits to the data file")]),_v(": AB3 UG specifies "),_c('a',{attrs:{"href":"https://se-education.org/addressbook-level3/UserGuide.html#editing-the-data-file"}},[_v("the current level of support for manually editing the data file")]),_v(" i.e., 'if you edit the file correctly, things will work; but if you edited it wrongly, there's no guarantee that things will work'. At least that level of support should be supported in the new product as well.")])])]),_v(" "),_c('div',{attrs:{"id":"triaging-feature-flaws"}},[_c('h5',{attrs:{"id":"feature-flaws-3"}},[_v("Feature flaws"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#feature-flaws-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Missing features and problems in how a feature is designed are considered feature flaws i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Feature flaws can be claimed as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")])]),_v(", if they qualify as per "),_c('trigger',{attrs:{"trigger":"click","for":"modal:bugTriaging-whenOutOfScope"}},[_v("rules explained above")]),_v(", except for these cases:\n"),_c('ul',[_c('li',[_v("if fixing the feature flaw is essential for the app to be reasonably useful")]),_v(" "),_c('li',[_v("if the feature is implemented to work in a certain way but it could have been implemented to work in a better way (from the end-user's point of view) without much additional effort")])])],1),_v(" "),_c('li',[_c('strong',[_v("Bugs related to duplicate detection")]),_v(": Duplicate detection (e.g., detecting if two persons in the address book are the same) is not trivial; often, detecting only the exact string/value matches is not enough. For example, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("John Doe")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("john doe")]),_v(" are likely to be the same person. Similarly, extra white space "),_c('span',{staticClass:"dimmed"},[_v("(e.g., the user typed an extra space between the two names)")]),_v(" is unlikely to mean they are two different persons. Typically, it is best if you can give a warning in such "),_c('em',[_v("near match")]),_v(" cases so that the user can make the final decision. "),_c('br'),_v("\nIf you app has a duplicate detection feature, make sure its limitations are made clear to the user so that users are not led to believe that duplicates are being detected while many potential duplicate cases go undetected. Otherwise, it can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Overzealous input validation")]),_v(": This is a common problem in UIs designed by programmers, because programmers tend to define 'valid' in strict data type point of view, whereas it should be defined based on the user's point of view. In general, it is better to warn rather than to block when inputs are not compliant with the expected format, unless accepting such inputs can hinder the operations of the software. Allowing such flexibility can in turn allow the software to be used in ways you didn't even anticipate while overzealous rejection of inputs can annoy the user:"),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 1: While your software allows only one phone number in input values, a user might want to input "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1234 5678 (HP) 1111-3333 (Office)")]),_v(" -- blocking that input might not add any value but allowing it does.")]),_c('br'),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Example 2: A user might want to enter an appointment/deadline that occurred in the past, just for record keeping purposes (note how Google Calendar doesn't prevent users from creating events in the past -- instead, it shows the event in a lighter color to warn that it is in the past).")]),_c('br'),_v("\nSuch overzealous input blocking can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nHowever, it is fine (and recommended) to show a warning for such inputs to guard against the deviation being a mistake rather than intentional."),_c('br'),_v("\nAt the same time, the lack of proper handling (either blocking or warning) potentially harmful invalid inputs can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug too.")]),_v(" "),_c('li',[_c('strong',[_v("Specificity of error message")]),_v(": Error messages can be correct but not specific enough "),_c('span',{staticClass:"dimmed"},[_v("(e.g., it says the input is 'invalid' without giving the reason, or gives too many possible reasons without pointing out the specific reason)")]),_v(". These cases can be considered "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v("."),_c('br'),_v("\nCalling an invalid value a 'format error' and vice versa is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" bug e.g., if a date input is required to be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("YYYY-MM-DD")]),_v(" format, "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-13-28")]),_v(" is a "),_c('em',[_v("format")]),_v(" error (reason: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("MM")]),_v(" should be in "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("1..12")]),_v(") but "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("2021-02-30")]),_v(" is an "),_c('em',[_v("invalid")]),_v(" input (reason: February doesn't have 30 days). However, issuing a 'Invalid date or incorrect format' error message for such a case (i.e., covering both bases) is acceptable if differentiating between the two qualifies as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Unnecessarily complicated (or hard-to-type) command formats")]),_v(" can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" as it is expected that the input formats will be optimized to get things done fast. Some examples: using very long keywords when shorter ones do, or making keywords case-sensitive when there is no need for it, using hard-to-type special characters in the format when it is possible to avoid them. On the other hand, limiting to short but hard-to-remember keywords can be problematic too. A better approach is to support both a short version (easier to type) and a longer (easier to remember) version for a keyword "),_c('span',{staticClass:"dimmed"},[_v("(an example from the Git world: flags "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("--no-verify")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("-n")]),_v(" are equivalent)")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Case sensitivity")]),_v(": In general, case sensitivity of something should follow the case sensitivity of the real world entity it represents e.g., as person names are not case-sensitive in the real world, they shouldn't be case-sensitive in the app either. The same applies for search keywords. Incorrect case sensitivity can be considered a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("A features less useful than it can be")]),_v(" is a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("FeatureFlaw")]),_v(". Some examples related to search-related features:\n"),_c('ul',[_c('li',[_v("If search keywords are case-sensitive, the user needs to remember the exact case of the words she is looking for. A case-insensitive search is usually more useful.")]),_v(" "),_c('li',[_v("Applying an AND constraint on search keywords means the user will miss out potentially useful search results unless she remembers exactly the words she is looking for. But if an OR constraint is used, the user can retrieve results even if she mis-remembers some of the search terms "),_c('span',{staticClass:"dimmed"},[_v("(searching for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Richards")]),_v(" can return both "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alice Davidson")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Alison Richards")]),_v(" one of which is likely to be what the user was looking for)")]),_v(".")])])])])]),_v(" "),_c('h5',{attrs:{"id":"documentation-bugs-3"}},[_v("Documentation bugs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation-bugs-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Broken/incorrect links")]),_v(": Severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Medium")]),_v(" depending on how much inconvenience they cause to the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Extra white space")]),_v(" introduced by the PDF conversion: Not counted as bugs unless it hinders the reader. Cases such as a diagram being split between pages are considered bugs, because they hinder the reader."),_c('br'),_v(" "),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('strong',[_v("'Hinder' the reader?")]),_v(" Don't interpret 'hinder' as 'impossible to read'. Even formatting issues such as too much/little padding, font size, alignment, inconsistencies, etc. can 'hinder' the reader in the sense they can slow down the reader or require the reader to put more effort than necessary. Those things that 'need to be fixed' are still bugs but of lower severities (depending on how much they hinder the reader -- most likely "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" if the issue is purely cosmetic).")]),_v(" "),_c('li',[_c('strong',[_v("UML notation variations")]),_v(" caused by the diagramming tool: Can be rejected if not contradicting the standard notation (as given by the textbook) i.e., extra decorations that are not misleading."),_c('br'),_v("\nOmitting optional notations is not a bug as long it doesn't hinder understanding.")]),_v(" "),_c('li',[_c('strong',[_v("UML notation errors")]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("(e.g., using dashed line where a solid line should be used)")]),_v(":"),_c('br'),_v("\nWhen deciding the severity, consider how much the notation error hinders the reader, but also keep in mind that notation errors hurt the credibility of the diagram (i.e., if even the notation is incorrect, how much can be trust this diagram 🤔?). The latter pushes up the severity further than otherwise. So, the severity can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")]),_v(" or higher.")]),_v(" "),_c('li',[_c('strong',[_v("Details missing from a diagram")]),_v(": In a similar vein to the above, omitting details from a diagram is OK if it does not mislead/hinder the reader."),_c('br'),_v("\nForgetting to include something is not the same as a deliberate decision to omit something in order to simplify the diagram "),_c('span',{staticClass:"dimmed"},[_v("e.g., the latter could accompany a note to the reader to mention which/some parts have been omitted, "),_c('em',[_v("if")]),_v(" it is worthwhile for the reader to know the omission.")]),_c('br'),_v("\nWhile many UML notations are optional, haphazard omissions without a good reason can affect consistency which affects readability e.g., it can be considered a minor bug if a sequence diagram omits an activation bars in some places but not in other places and yet the omission doesn't make the diagram any easier to read.")]),_v(" "),_c('li',[_c('strong',[_v("Nitty-gritty details missing from the UG")]),_v(" is not a bug long as the user is informed of those details using other means such as error messages or in-app help.")]),_v(" "),_c('li',[_c('strong',[_v("Minor typos")]),_v(": These are still considered as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(" bugs (even if it is in the actual UI) which carry a very tiny penalty."),_c('br'),_v("\nAs avoiding/correcting obvious typos does not take a significant extra effort, they should not have been postponed to a future version. Plus, correcting typos is allowed during the feature freeze. So, they don't qualify for "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Minor grammar errors")]),_v(": You may categorize a minor grammar bug as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(". And, a grammar bug can be marked as "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("response.NotInScope")]),_v(" if it doesn't hinder the reader.")]),_v(" "),_c('li',[_c('strong',[_v("Severity of bugs related to "),_c('em',[_v("missing requirements")])]),_v(" (e.g., missing user stories)? Depends on the potential damage the omission can cause. Keep in mind that not documenting a requirement increases the risk of it not getting implemented in a timely manner (i.e., future developers will not know that feature needs to be implemented).")]),_v(" "),_c('li',[_c('strong',[_v("Unfulfilled NFRs")]),_v(": If the DG mentions non-functional requirements that are not met by the product, it can be a "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("DocumentationBug")]),_v(" if the NFR was unreasonable in the first place. Otherwise, it can be "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(" bug.")]),_v(" "),_c('li',[_c('strong',[_v("Details in the diagram too small")]),_v(": This is usually a symptom of having too much info in the diagram. A common example is sequence diagrams showing low-level details of multiple components (recommended: A sequence diagram should show internal interactions of at most one component i.e., treat other components as black boxes)."),_c('br'),_v("\nWhile the reader can zoom to see smaller details, this can still be considered a cosmetic issue (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")]),_v(").")]),_v(" "),_c('li',[_c('strong',[_v("Tester misunderstandings can be caused by inadequate documentation")]),_v(". Some bug reports that arose from a tester misunderstanding something could be due to a flaw in the documentation e.g., something was not explained clearly enough in the document.")]),_v(" "),_c('li',[_c('strong',[_v("Undocumented features:")]),_v(" "),_c('ul',[_c('li',[_v("If the said feature is not visible to the user and very unlikely for the user to detect it by accident, we can assume the feature was never meant to be released in the current version, which should be fine.")]),_v(" "),_c('li',[_v("If the feature is simple, easily discoverable, and intuitive to use, it is fine to be omitted from the UG, especially if the inclusion seems adding noise rather than value.")]),_v(" "),_c('li',[_v("Other cases point to some issue, either an omission in the UG, or a WIP feature not properly protected/hidden/disabled in the released product.")])])])])])]),_v(" "),_c('p')],1)])],1),_c('p'),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('panel',{staticClass:"embedding algolia-no-index",attrs:{"type":"","minimized":""},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_v("Admin "),_c('span',[_c('span',{staticClass:"glyphicon glyphicon-log-in",attrs:{"aria-hidden":"true"}})]),_v(" tP Grading → Grading bugs found in the PE")])]},proxy:true}])},[_v(" "),_c('div',[_c('h5',{attrs:{"id":"grading-bugs-found-in-the-pe-3"}},[_v("Grading bugs found in the PE"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#grading-bugs-found-in-the-pe-3","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('mark',[_v("Of the "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("1. "),_c('em',[_v("Developer Testing")]),_v(" component -- based on the bugs found in your code;"),_c('br'),_v("2. "),_c('em',[_v("System/Acceptance Testing")]),_v(" component -- based on the bugs found in others' code")]},proxy:true}])},[_v("two components of testing")]),_v(", the one you do better will be given a 70% weight and the other a 30% weight")],1),_v(" so that your total score is driven by your strengths rather than weaknesses.")]),_v(" "),_c('li',[_c('strong',[_v("Bugs rejected by the dev team")]),_v(", if the rejection is approved by the teaching team, will not affect marks of the tester or the developer.")]),_v(" "),_c('li',[_c('strong',[_v("The penalty/credit for a bug varies based on the severity")]),_v(" of the bug: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.High")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Medium")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.Low")]),_v(" > "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.VeryLow")])]),_v(" "),_c('li',[_c('strong',[_v("The three bug types (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FunctionalityBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.DocumentationBug")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("type.FeatureFlaw")]),_v(") are counted for three different grade components.")]),_v(" The penalty/credit can vary based on the bug type. "),_c('span',{staticClass:"dimmed"},[_v("Given that you are not told which type has a bigger impact on the grade, always choose the most suitable type for a bug rather than try to choose a type that benefits your grade.")])]),_v(" "),_c('li',[_c('strong',[_v("The penalty for a bug is divided equally")]),_v(" among "),_c('popover',{scopedSlots:_u([{key:"content",fn:function(){return [_v("In the PE, each team get to decide who are the assignees for each bug report they received")]},proxy:true}])},[_v("assignees")]),_v(".")],1),_v(" "),_c('li',[_c('strong',[_v("Developers are not penalized for duplicate bug reports")]),_v(" they received but the testers earn credit for duplicate bug reports they submitted, provided the duplicates are not submitted by the same tester.")]),_v(" "),_c('li',[_c('strong',[_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., the same bug reported by many testers")]},proxy:true}])},[_c('em',[_v("Obvious")]),_v(" bugs")]),_v(" earn less credit")],1),_v(" for the tester and slightly higher penalty for the developer.")]),_v(" "),_c('li',[_c('strong',[_v("If the team you tested has a low bug count")]),_v(" i.e., total bugs found by "),_c('em',[_v("all")]),_v(" testers is low, we will fall back on other means "),_c('span',{staticClass:"dimmed"},[_v("(e.g., performance in PE dry run)")]),_v(" to calculate your marks for system/acceptance testing.")]),_v(" "),_c('li',[_c('strong',[_v("Your marks for developer testing depends on the "),_c('em',[_v("bug density")]),_v(" rather than total bug count.")]),_v(" Here's an example:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a big feature consisting of a lot of code → 4/5 marks")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("n")]),_v(" bugs found in your feature; it is a small feature with a small amount of code → 1/5 marks")])])]),_v(" "),_c('li',[_c('strong',[_v("You don't need to find "),_c('em',[_v("all")]),_v(" bugs in the product")]),_v(" to get full marks. For example, finding half of the bugs of that product or 4 bugs, whichever the lower, could earn you full marks.")]),_v(" "),_c('li',[_c('strong',[_v("Excessive incorrect downgrading/rejecting/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("marking as duplicates")]},proxy:true}])},[_v("duplicate-flagging")])],1),_v(", if deemed an attempt to "),_c('em',[_v("game the system")]),_v(", will be penalized.")])])])])],1),_c('p'),_v(" "),_c('ul',[_c('li',[_v("If the dev team disagreed with an aspect (i.e., type/severity/"),_c('tooltip',{scopedSlots:_u([{key:"content",fn:function(){return [_v("i.e., accept vs not accept")]},proxy:true}])},[_v("validity")]),_v(") and you now agree with the dev team's position, it will not hurt your accuracy rating. Here are some examples (for the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("severity.*")]),_v("):")],1)]),_v(" "),_c('div',{staticClass:"indented-level1"},[_c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Tester choice")]),_v(" "),_c('th',[_v("Dev choice")]),_v(" "),_c('th',[_v("Tester reaction")]),_v(" "),_c('th',[_v("Teacher decision")]),_v(" "),_c('th',[_v("Dev accuracy")]),_v(" "),_c('th',[_v("Tester accuracy")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("agreed")]),_v(" "),_c('td'),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_v("no effect")])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])])]),_v(" "),_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("High")])]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low")])]),_v(" "),_c('td',[_v("disagreed")]),_v(" "),_c('td',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Low ")])]),_v(" "),_c('td',[_c('span',{staticClass:"text-success"},[_c('span',{staticClass:"fas fa-arrow-up",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('td',[_c('span',{staticClass:"text-danger"},[_c('span',{staticClass:"fas fa-arrow-down",attrs:{"aria-hidden":"true"}})])])])])])])]),_v(" "),_c('ul',[_c('li',[_v("If you do not respond to a dev response, we'll assume that you agree with it.")]),_v(" "),_c('li',[_v("Procedure:")])]),_v(" "),_c('div',{staticClass:"indented-level2"},[_c('tabs',[_c('tab',{scopedSlots:_u([{key:"header",fn:function(){return [_v("Using CATcher")]},proxy:true}])},[_v(" "),_c('ul',[_c('li',[_v("When the phase has been announced as open, login to "),_c('a',{attrs:{"href":"https://catcher-org.github.io/CATcher"}},[_v("CATcher")]),_v(" as usual (profile: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("CS2103/T PE")]),_v(").")]),_v(" "),_c('li',[_v("For each issue listed in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issues Pending Responses")]),_v(" section:\n"),_c('ul',[_c('li',[_v("Click on it to go to the details, and read the dev team's response.")]),_v(" "),_c('li',[_v("If you disagree with any of the items listed, tick on the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("I disagree")]),_v(" tick box and enter your justification for the disagreement, and click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(".")]),_v(" "),_c('li',[_v("If you are fine with the team's changes, click "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Save")]),_v(" without any other changes upon which the issue will move to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Issue Responded")]),_v(" section.")])])]),_v(" "),_c('li',[_v("No action is required for the bugs the team accepted "),_c('em',[_v("exactly as you reported them")]),_v(" (i.e., no change to type or severity). They are shown in CATcher for your reference only.")])])]),_v(" "),_c('tab',{staticClass:"algolia-no-index",scopedSlots:_u([{key:"header",fn:function(){return [_v("Not using CATcher")]},proxy:true}])},[_v(" "),_c('div',{staticClass:"indented-less"},[_c('div',[_c('box',{attrs:{"type":"wrong"}},[_c('p',[_c('strong',[_v("You must use CATcher. You are strictly prohibited from editing PE bug reports using the GitHub Web interface")]),_v(" as it can render bug reports unprocessable by CATcher, sometimes in an irreversible ways, and can affect the entire class. Please contact the prof if you are unable to use CATcher for some reason.")])])],1)])])],1)],1),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: What if the team rejected my bug report without giving a reason?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("You can disagree with the rejection, and the teaching team will likely rule in your favor in the next phase.")])]),_v(" "),_c('panel',{staticClass:"algolia-no-index",attrs:{"type":"seamless"},scopedSlots:_u([{key:"header",fn:function(){return [_c('p',[_c('span',{staticClass:"dimmed"},[_v("FAQ: Can I add more information about the bug when I object to a dev team's response?")])])]},proxy:true}])},[_v(" "),_c('p',[_v("Yes, you may. Given that the dev team did not get to see this addition info when they triaged the bug, the weight such additional info add to your case is lower than if you had that info in the initial bug report. Nevertheless, it can still help your cause, especially if the dev team should have thought about that info on their own, even if they were missing in the initial bug report.")])]),_v(" "),_c('p'),_v(" "),_c('hr',{staticClass:"thick-2 border-success"}),_v(" "),_c('h4',{attrs:{"id":"pe-phase-4-tutor-moderation"}},[_c('span',{staticClass:"badge bg-success"},[_v("PE")]),_v(" "),_c('span',{staticClass:"text-success"},[_v("Phase 4: Tutor Moderation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#pe-phase-4-tutor-moderation","onclick":"event.stopPropagation()"}})]),_v(" "),_c('span',[_v("In this phase tutors will look through all dev responses you objected to in the previous phase and decide on a final outcome. Students are not usually involved in this phase.")])],1)])],1),_c('p')]),_v(" "),_c('p'),_v(" "),_c('h4',{attrs:{"id":"6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_c('span',{staticClass:"badge rounded-pill bg-dark p-2"},[_c('big',[_c('big',[_v("6")])],1)],1),_v(" "),_m(31),_v(" "),_m(32),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600","onclick":"event.stopPropagation()"}})]),_v(" "),_m(33),_v(" "),_c('p'),_v(" "),_c('div')])])]),_v(" "),_c('overlay-source',{staticClass:"fixed-header-padding",attrs:{"id":"page-nav","tag-name":"nav","to":"page-nav"}},[_c('div',{staticClass:"nav-component slim-scroll"},[_c('overlay-source',{staticClass:"nav nav-pills flex-column my-0 small no-flex-wrap",attrs:{"id":"mb-page-nav","tag-name":"nav","to":"mb-page-nav"}},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#week-13-mon-nov-11th-project"}},[_v("Week 13 [Mon, Nov 11th] - Project‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#tp-public-release-v1-6"}},[_v(" tP: Public release → v1.6 ‎")]),_v(" "),_c('nav',{staticClass:"nav nav-pills flex-column my-0 nested no-flex-wrap"},[_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#intro-to-tp-week-13"}},[_v("Intro to tP Week 13‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#1-fix-pe-d-bugs"}},[_v("1 Fix PE-D bugs‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#2-submit-final-deliverables-tue-nov-12th-14-00"}},[_v("2 Submit final deliverables Tue, Nov 12th 14:00‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#3-prepare-for-the-practical-exam"}},[_v("3 Prepare for the practical exam‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#4-ensure-the-code-is-reposense-compatible"}},[_v("4 Ensure the code is RepoSense-compatible‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#5-attend-the-practical-exam-fri-nov-15th-1600-1800"}},[_v("5 Attend the practical exam Fri, Nov 15th 1600-1800‎")]),_v(" "),_c('a',{pre:true,attrs:{"class":"nav-link py-1","href":"#6-if-needed-attend-the-makeup-practical-exam-sun-nov-17th-1400-1600"}},[_v("6 [if needed] Attend the makeup practical exam Sun, Nov 17th 1400-1600‎")])])])])],1)]),_v(" "),_c('scroll-top-button')],1),_v(" "),_m(34)])} }; var pageVueStaticRenderFns = [function anonymous( ) { @@ -107,6 +107,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('div',[_c('ul',[_c('li',[_v("In the very unlikely event that the PE had to be cancelled due to technical issues, attend the makeup PE on this day.")]),_v(" "),_c('li',[_v("Note: This is "),_c('span',{staticClass:"text-danger"},[_v("not an alternative option for students who could not attend the PE")]),_v(", as all students need to do the PE at the same time.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week13/topics.html b/schedule/week13/topics.html index e8c3ea0656..ca327884c3 100644 --- a/schedule/week13/topics.html +++ b/schedule/week13/topics.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week13/topics.page-vue-render.js b/schedule/week13/topics.page-vue-render.js index 99b6585b54..71fe7ef8e4 100644 --- a/schedule/week13/topics.page-vue-render.js +++ b/schedule/week13/topics.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_c('nav',[_c('ul',{staticClass:"pagination mt-2"},[_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week12/index.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-chevron-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("Prev. Week")])])])]),_v(" "),_c('li',{staticClass:"page-item"},[_v("   ")]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-bell",attrs:{"aria-hidden":"true"}})])]),_v(" Summary")])]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week13/admin.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})])]),_v(" Admin")])]),_v(" "),_c('li',{staticClass:"page-item active"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week13/topics.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-book",attrs:{"aria-hidden":"true"}})])]),_v(" Topics")])]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week13/project.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Project")])]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week13/tutorial.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-chalkboard-teacher",attrs:{"aria-hidden":"true"}})])]),_v(" Tutorial")])]),_v(" "),_c('li',{staticClass:"page-item"},[_v("   ")]),_c('li',{staticClass:"page-item disabled"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week13/index.html"}},[_c('span',[_c('strong',[_v("Next Week")]),_v(" "),_c('span',{staticClass:"glyphicon glyphicon-chevron-right",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('h1',{attrs:{"id":"week-13-mon-nov-11th-topics"}},[_v("Week 13 "),_c('small',[_c('small',[_c('span',{staticClass:"dimmed"},[_v("[Mon, Nov 11th]")]),_v(" - Topics")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#week-13-mon-nov-11th-topics","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div'),_v(" "),_c('p',[_c('span',{staticClass:"dimmed"},[_v("No topics assigned to this week.")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week13/tutorial.html b/schedule/week13/tutorial.html index 7691c4d596..39df9201ab 100644 --- a/schedule/week13/tutorial.html +++ b/schedule/week13/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week13/tutorial.page-vue-render.js b/schedule/week13/tutorial.page-vue-render.js index 6009c5e1dd..9b051e2a3d 100644 --- a/schedule/week13/tutorial.page-vue-render.js +++ b/schedule/week13/tutorial.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('nav',[_c('ul',{staticClass:"pagination mt-2"},[_c('li',{st with(this){return _c('h1',{attrs:{"id":"week-13-mon-nov-11th-tutorial"}},[_v("Week 13 "),_c('small',[_c('small',[_c('span',{staticClass:"dimmed"},[_v("[Mon, Nov 11th]")]),_v(" - Tutorial")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#week-13-mon-nov-11th-tutorial","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week2/admin.html b/schedule/week2/admin.html index 010240f08c..a4e481f975 100644 --- a/schedule/week2/admin.html +++ b/schedule/week2/admin.html @@ -13,7 +13,7 @@

    Week 2 [Mon, Aug 19th] - Admin

    1. Submit weekly quiz Fri, Aug 23rd 1600
    2. Get connected to our communication channels

    1 Submit weekly quiz Fri, Aug 23rd 1600

    • Read weekly topics allocated for this week. Submit the Weekly Quiz (on Canvas) to test your knowledge of those topics.
      -Weekly quizzes are counted for participation.

    FAQ When can we see the quiz answers?


    2 Get connected to our communication channels

    • If you haven't done so already, follow the 'Preparation' instructions of the following panel, to get connected with the communication channels used by the course.

    + Other info relevant to this week:

    Admin Apdx A: Course Principles : OPTIONAL

    FAQ Why use a separate website instead of Canvas?


    FAQ Why slides are not detailed?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Weekly quizzes are counted for participation.

    FAQ When can we see the quiz answers?


    2 Get connected to our communication channels

    • If you haven't done so already, follow the 'Preparation' instructions of the following panel, to get connected with the communication channels used by the course.

    + Other info relevant to this week:

    Admin Apdx A: Course Principles : OPTIONAL

    FAQ Why use a separate website instead of Canvas?


    FAQ Why slides are not detailed?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week2/admin.page-vue-render.js b/schedule/week2/admin.page-vue-render.js index 3e864cd63a..a79684d0cc 100644 --- a/schedule/week2/admin.page-vue-render.js +++ b/schedule/week2/admin.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Read weekly topics")]),_v(" with(this){return _c('ul',[_c('li',[_v("If you haven't done so already, follow the 'Preparation' instructions of the following panel, to get connected with the communication channels used by the course.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week2/index.html b/schedule/week2/index.html index 2eaaddcd9e..e66c7092c4 100644 --- a/schedule/week2/index.html +++ b/schedule/week2/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 2 [Mon, Aug 19th] - Summary

    Umm... you've finished Week 1 tasks already, right? If not, please finish them first before starting on this week's tasks.

    Noticed any issues (even minor typos) in the course website (or in resources in se-edu/guides)? Have suggestions for improvements, or noticed a part that wasn't clear?
    You can earn bonus participation points by reporting them in the forum -- plus it helps us improve the course website too.

    [MUST-WATCH] Briefing Videos for Week 2

    This week's briefing videos start with a detour.


    0. Detour: SDLC Basics: Watch the following video covering the week 2 topic 'SDLC Process Models Basics', as the concepts covered in there are referenced in the rest of the course briefing.

    Video 6 mins -- Detour: SDLC Basics


    1. Iterative + Brownfield = ???: How the iterative and brownfield approach taken by the course impacts your learning experience.

    Video 6 mins

    2. Challenges and Solutions: How to tackle three challenges you'll face in the course, namely, information overload, workload, and technical problems.

    Video 11 mins


    3. Week 1->2 Briefing (Week 1 Recap + Week 2 Preview): This video recaps Week 1 and gives a preview of what you need to do in Week 2.
    Note: While weekly briefings are normally done in hybrid mode, this week's briefing is released as a pre-recorded video, to allow you to get started with week 2 tasks early.

    Video 4 mins


    Admin Weekly Schedule → Extract

    Before attempting weekly project tasks, go through the weekly topics as the knowledge from those topics may be needed to complete the project tasks.

    Week 2 Canvas quiz will open by week 1 Wednesday (earlier than the normal opening time of Friday 4pm).

    Topics:

    • [W2.2] SDLC Process Models: Basics

    • [W2.3] RCS: Revision History

    • [W2.4] RCS: Remote Repos

    • [W2.5] IDEs: Basic Features

    • [W2.6] Automated Testing of Text UIs

    Full ToC


    Admin:

    1. Submit weekly quiz Fri, Aug 23rd 1600
    2. Get connected to our communication channels

    iP:

    1. Learn about the project
    2. Set up prerequisites
    3. Set up the project in your computer
    4. Add Increments while committing frequently: Level-0, Level-1, Level-2, Level-3, Level-4, A-TextUiTesting, Level-5, Level-6, A-Enums Fri, Aug 23rd 1600

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 2 [Mon, Aug 19th] - Summary

    Umm... you've finished Week 1 tasks already, right? If not, please finish them first before starting on this week's tasks.

    Noticed any issues (even minor typos) in the course website (or in resources in se-edu/guides)? Have suggestions for improvements, or noticed a part that wasn't clear?
    You can earn bonus participation points by reporting them in the forum -- plus it helps us improve the course website too.

    [MUST-WATCH] Briefing Videos for Week 2

    This week's briefing videos start with a detour.


    0. Detour: SDLC Basics: Watch the following video covering the week 2 topic 'SDLC Process Models Basics', as the concepts covered in there are referenced in the rest of the course briefing.

    Video 6 mins -- Detour: SDLC Basics


    1. Iterative + Brownfield = ???: How the iterative and brownfield approach taken by the course impacts your learning experience.

    Video 6 mins

    2. Challenges and Solutions: How to tackle three challenges you'll face in the course, namely, information overload, workload, and technical problems.

    Video 11 mins


    3. Week 1->2 Briefing (Week 1 Recap + Week 2 Preview): This video recaps Week 1 and gives a preview of what you need to do in Week 2.
    Note: While weekly briefings are normally done in hybrid mode, this week's briefing is released as a pre-recorded video, to allow you to get started with week 2 tasks early.

    Video 4 mins


    Admin Weekly Schedule → Extract

    Before attempting weekly project tasks, go through the weekly topics as the knowledge from those topics may be needed to complete the project tasks.

    Week 2 Canvas quiz will open by week 1 Wednesday (earlier than the normal opening time of Friday 4pm).

    Topics:

    • [W2.2] SDLC Process Models: Basics

    • [W2.3] RCS: Revision History

    • [W2.4] RCS: Remote Repos

    • [W2.5] IDEs: Basic Features

    • [W2.6] Automated Testing of Text UIs

    Full ToC


    Admin:

    1. Submit weekly quiz Fri, Aug 23rd 1600
    2. Get connected to our communication channels

    iP:

    1. Learn about the project
    2. Set up prerequisites
    3. Set up the project in your computer
    4. Add Increments while committing frequently: Level-0, Level-1, Level-2, Level-3, Level-4, A-TextUiTesting, Level-5, Level-6, A-Enums Fri, Aug 23rd 1600

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week2/index.page-vue-render.js b/schedule/week2/index.page-vue-render.js index 8d687b4d28..3187c5fe84 100644 --- a/schedule/week2/index.page-vue-render.js +++ b/schedule/week2/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('li',[_c('span',[_v("Get connected to our communication cha with(this){return _c('div',[_c('p',[_c('strong',[_v("iP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_v("Learn about the project")])]),_v(" "),_c('li',[_c('span',[_v("Set up prerequisites")])]),_v(" "),_c('li',[_c('span',[_v("Set up the project in your computer")])]),_v(" "),_c('li',[_v("Add Increments while committing frequently: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-0")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-1")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-2")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-3")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-4")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-TextUiTesting")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-5")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-6")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Enums")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Aug 23rd 1600")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week2/project.html b/schedule/week2/project.html index c145df458a..08dde98bb1 100644 --- a/schedule/week2/project.html +++ b/schedule/week2/project.html @@ -25,7 +25,7 @@ commit id: "Add support for list" commit id: "Add support for bye"
  • git push the code to your fork
    Git doesn't push tags unless you specifically ask it to. -After pushing a tag to your fork, you should be able to see that tag by visiting https://github.com/YOUR_USER_NAME/REPO_NAME/tags e.g., https://github.com/se-edu/addressbook-level3/tags
    If you encounter issues connecting Sourcetree with your GitHub account, refer to this Sourcetree Tutorial.
  • The relevant textbook topics are:
    • Remember to take note of our plagiarism policies, if you haven't done so already:

    iP feels like 'same same' ...?

    As you do the iP, if you feel like you are not learning enough new stuff as you've done similar work before (at least on the Java/OOP side), there is an alternative approach you can take to the iP. See the panel below if you are interested.

    Duke Level-0: Rename, Greet, Exit

    Duke Level-1: Echo

    Duke Level-2: Add, List

    Duke Level-3: Mark as Done

    Duke Level-4: ToDo, Event, Deadline

    Duke A-TextUiTesting: Automated Text UI Testing

    Duke Level-5: Handle Errors

    Duke Level-6: Delete

    Duke A-Enums: Use Enums if-applicable

    FAQ about iP increments

    FAQ How are the iP git tags used in grading?


    FAQ What if I discovered a bug after I finished an increment?


    FAQ I did multiple increments in the same commit. How to fix?


    FAQ The requirements of an increment scheduled for this week is already satisfied by the work I did in an earlier week. What now?


    FAQ My iP increments are not detected by the dashboard because I forgot to push my tags earlier. What now?


    FAQ Oh no! I made a mistake in my tag/branch name.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +After pushing a tag to your fork, you should be able to see that tag by visiting https://github.com/YOUR_USER_NAME/REPO_NAME/tags e.g., https://github.com/se-edu/addressbook-level3/tags
    If you encounter issues connecting Sourcetree with your GitHub account, refer to this Sourcetree Tutorial.
  • The relevant textbook topics are:
    • Remember to take note of our plagiarism policies, if you haven't done so already:

    iP feels like 'same same' ...?

    As you do the iP, if you feel like you are not learning enough new stuff as you've done similar work before (at least on the Java/OOP side), there is an alternative approach you can take to the iP. See the panel below if you are interested.

    Duke Level-0: Rename, Greet, Exit

    Duke Level-1: Echo

    Duke Level-2: Add, List

    Duke Level-3: Mark as Done

    Duke Level-4: ToDo, Event, Deadline

    Duke A-TextUiTesting: Automated Text UI Testing

    Duke Level-5: Handle Errors

    Duke Level-6: Delete

    Duke A-Enums: Use Enums if-applicable

    FAQ about iP increments

    FAQ How are the iP git tags used in grading?


    FAQ What if I discovered a bug after I finished an increment?


    FAQ I did multiple increments in the same commit. How to fix?


    FAQ The requirements of an increment scheduled for this week is already satisfied by the work I did in an earlier week. What now?


    FAQ My iP increments are not detected by the dashboard because I forgot to push my tags earlier. What now?


    FAQ Oh no! I made a mistake in my tag/branch name.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week2/project.page-vue-render.js b/schedule/week2/project.page-vue-render.js index e185338aa0..53b4b24c1d 100644 --- a/schedule/week2/project.page-vue-render.js +++ b/schedule/week2/project.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('li',[_c('strong',[_v("Set up the project in your IDE")]),_ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Aug 23rd 1600")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week2/topics.html b/schedule/week2/topics.html index 604f41cb7b..85588cba05 100644 --- a/schedule/week2/topics.html +++ b/schedule/week2/topics.html @@ -1105,7 +1105,7 @@ -

    Note that the above technique is only suitable when testing CLI apps, and only if the exact output can be predetermined. If the output varies from one run to the other (e.g. it contains a time stamp), this technique will not work. In those cases, you need more sophisticated ways of automating tests.


    Follow up notes for the item(s) above:

    Congrats! You've made it to the end of this week's topics. It feels like a lot right now but now that we got an early start, this stuff will be second nature to you by the time you are done with the semester. 😃


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Note that the above technique is only suitable when testing CLI apps, and only if the exact output can be predetermined. If the output varies from one run to the other (e.g. it contains a time stamp), this technique will not work. In those cases, you need more sophisticated ways of automating tests.


    Follow up notes for the item(s) above:

    Congrats! You've made it to the end of this week's topics. It feels like a lot right now but now that we got an early start, this stuff will be second nature to you by the time you are done with the semester. 😃


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week2/topics.page-vue-render.js b/schedule/week2/topics.page-vue-render.js index aabca54db1..8d2ed4ae9f 100644 --- a/schedule/week2/topics.page-vue-render.js +++ b/schedule/week2/topics.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week2/tutorial.html b/schedule/week2/tutorial.html index 0e48df4ec2..dec10336c4 100644 --- a/schedule/week2/tutorial.html +++ b/schedule/week2/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/schedule/week2/tutorial.page-vue-render.js b/schedule/week2/tutorial.page-vue-render.js index c96af518b0..7c6f5c75e9 100644 --- a/schedule/week2/tutorial.page-vue-render.js +++ b/schedule/week2/tutorial.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('div',{staticClass:"website-content"},[_c('nav',[_c('ul',{staticClass:"pagination mt-2"},[_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week1/index.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-chevron-left",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("Prev. Week")])])])]),_v(" "),_c('li',{staticClass:"page-item"},[_v("   ")]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week2/index.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-bell",attrs:{"aria-hidden":"true"}})])]),_v(" Summary")])]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week2/admin.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})])]),_v(" Admin")])]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week2/topics.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-book",attrs:{"aria-hidden":"true"}})])]),_v(" Topics")])]),_v(" "),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week2/project.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-drafting-compass",attrs:{"aria-hidden":"true"}})])]),_v(" Project")])]),_v(" "),_c('li',{staticClass:"page-item active"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week2/tutorial.html"}},[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-chalkboard-teacher",attrs:{"aria-hidden":"true"}})])]),_v(" Tutorial")])]),_v(" "),_c('li',{staticClass:"page-item"},[_v("   ")]),_c('li',{staticClass:"page-item"},[_c('a',{staticClass:"page-link",attrs:{"href":"/website/schedule/week3/index.html"}},[_c('span',[_c('strong',[_v("Next Week")]),_v(" "),_c('span',{staticClass:"glyphicon glyphicon-chevron-right",attrs:{"aria-hidden":"true"}})])])])])]),_v(" "),_c('p'),_v(" "),_c('h1',{attrs:{"id":"week-2-mon-aug-19th-tutorial"}},[_v("Week 2 "),_c('small',[_c('small',[_c('span',{staticClass:"dimmed"},[_v("[Mon, Aug 19th]")]),_v(" - Tutorial")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#week-2-mon-aug-19th-tutorial","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',[_c('ul',[_c('li',[_v("No tutorials in this week.")]),_v(" "),_c('li',[_c('mark',[_v("Strongly encouraged to use the "),_c('a',{attrs:{"href":"/website/admin/tutorials.html"}},[_v("tutorial timeslot+venue")])]),_v(" to sit together with your team/tutorial-mates and work on the iP together (so that you can help each other).")]),_v(" "),_c('li',[_v("Encountered doubts/problems while doing weekly tasks? Please post in the "),_c('a',{attrs:{"href":"https://github.com/nus-cs2103-AY2425S1/forum/issues"}},[_v("forum")]),_v(".")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week3/admin.html b/schedule/week3/admin.html index e88edc48e7..10d46fd12a 100644 --- a/schedule/week3/admin.html +++ b/schedule/week3/admin.html @@ -13,7 +13,7 @@

    Week 3 [Mon, Aug 26th] - Admin

    1. Submit weekly quiz
    2. [CS2103 students only] Form teams during the tutorial

    1 Submit weekly quiz

    • Weekly quiz: Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline (i.e., before the following -weekly briefing).

    2 [CS2103 students only] Form teams during the tutorial

    + Other info relevant to this week:

    Admin Tutorials

    Admin Peer Evaluations

    Admin Standards/Conventions

    Admin tP: Supervision/Guidance

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +weekly briefing).

    2 [CS2103 students only] Form teams during the tutorial

    + Other info relevant to this week:

    Admin Tutorials

    Admin Peer Evaluations

    Admin Standards/Conventions

    Admin tP: Supervision/Guidance

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week3/admin.page-vue-render.js b/schedule/week3/admin.page-vue-render.js index 22aeed4467..7e6033fd68 100644 --- a/schedule/week3/admin.page-vue-render.js +++ b/schedule/week3/admin.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',[_v("Weekly quiz")]),_ with(this){return _c('div',[_c('ul',[_c('li',[_v("See the "),_c('a',{attrs:{"href":"/website/schedule/week3/tutorial.html"}},[_c('span',{staticClass:"border bg-white ps-1 pe-1 text-nowrap"},[_c('span',[_c('span',{staticClass:"fas fa-chalkboard-teacher",attrs:{"aria-hidden":"true"}})]),_v(" Tutorial")])]),_v(" tab for more info.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week3/index.html b/schedule/week3/index.html index 072ce9725f..4d2960ebe2 100644 --- a/schedule/week3/index.html +++ b/schedule/week3/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 3 [Mon, Aug 26th] - Summary

    We start tutorials this week, starting from Wed, Aug 28th . The tutorial timetable is on the course website. There are no tutorials on Mon, Aug 26th.

    In-video quizzes can earn you bonus participation marks!

    Starting from week 3, some pre-recorded videos in the Topics tab will contain in-video quizzes. Videos containing quizzes are labelled Video Q+ (instead of the usual Video)

    Answering in-video quizzes can earn you bonus participation marks.

    [MUST-WATCH] One More Course Briefing Segment (9 minutes)

    One course briefing video to watch this week: You watched quite a few course briefing videos over the last two weeks. There are few more remaining parts which will be released closer to events they cover (e.g., the part covering the exam will be released closer to the exam). This week, we have one more course briefing video, given below:

    CS2103/T Pitfalls (and how to avoid them)

    Video 9 mins

    The weekly briefing for this week will be done in hybrid mode -- you can attend it F2F (@UTown-AUD2 Fri, Aug 23rd from 4pm), join via Zoom, watch the recording later, or skip it altogether).
    iP Help Session: This week's' briefing will be followed by a F2F help session for those who are stuck in the iP due to technical difficulties. To attend that help session, be in UTown-AUD2 at least by 4.50pm.


    Topics:

    • [W3.1] RCS: Branching

    • [W3.2] RCS: Creating Pull Requests

    • [W3.3] Automating the Build Process

    • [W3.4] Java: JavaDoc, file I/O, packages, JARs

    • [W3.5] Code Quality: Coding Standards

    • [W3.6] Developer Testing

    • [W3.7] Unit Testing

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [CS2103 students only] Form teams during the tutorial

    iP:

    1. Do any leftover iP tasks from the previous week
    2. Create a PR to the upstream repo
    3. Add Increments as branches: Level-7, Level-8
    4. Add Increments: A-MoreOOP, A-Packages, A-Gradle, A-JUnit, A-Jar
    5. Add Increments as parallel branches: A-JavaDoc, A-CodingStandard, Level-9
    6. [Optional] Get a head start on JavaFX

    tP:

    1. Individual Task: Explore AB3 features Sat, Aug 31st 23:59
    2. Team Task: Set up a project meeting time by the end of the tutorial
    3. Team Task: Check up on team's collective iP status Tue, Sep 3rd

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 3 [Mon, Aug 26th] - Summary

    We start tutorials this week, starting from Wed, Aug 28th . The tutorial timetable is on the course website. There are no tutorials on Mon, Aug 26th.

    In-video quizzes can earn you bonus participation marks!

    Starting from week 3, some pre-recorded videos in the Topics tab will contain in-video quizzes. Videos containing quizzes are labelled Video Q+ (instead of the usual Video)

    Answering in-video quizzes can earn you bonus participation marks.

    [MUST-WATCH] One More Course Briefing Segment (9 minutes)

    One course briefing video to watch this week: You watched quite a few course briefing videos over the last two weeks. There are few more remaining parts which will be released closer to events they cover (e.g., the part covering the exam will be released closer to the exam). This week, we have one more course briefing video, given below:

    CS2103/T Pitfalls (and how to avoid them)

    Video 9 mins

    The weekly briefing for this week will be done in hybrid mode -- you can attend it F2F (@UTown-AUD2 Fri, Aug 23rd from 4pm), join via Zoom, watch the recording later, or skip it altogether).
    iP Help Session: This week's' briefing will be followed by a F2F help session for those who are stuck in the iP due to technical difficulties. To attend that help session, be in UTown-AUD2 at least by 4.50pm.


    Topics:

    • [W3.1] RCS: Branching

    • [W3.2] RCS: Creating Pull Requests

    • [W3.3] Automating the Build Process

    • [W3.4] Java: JavaDoc, file I/O, packages, JARs

    • [W3.5] Code Quality: Coding Standards

    • [W3.6] Developer Testing

    • [W3.7] Unit Testing

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [CS2103 students only] Form teams during the tutorial

    iP:

    1. Do any leftover iP tasks from the previous week
    2. Create a PR to the upstream repo
    3. Add Increments as branches: Level-7, Level-8
    4. Add Increments: A-MoreOOP, A-Packages, A-Gradle, A-JUnit, A-Jar
    5. Add Increments as parallel branches: A-JavaDoc, A-CodingStandard, Level-9
    6. [Optional] Get a head start on JavaFX

    tP:

    1. Individual Task: Explore AB3 features Sat, Aug 31st 23:59
    2. Team Task: Set up a project meeting time by the end of the tutorial
    3. Team Task: Check up on team's collective iP status Tue, Sep 3rd

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week3/index.page-vue-render.js b/schedule/week3/index.page-vue-render.js index b4d25328c1..d99b03f7db 100644 --- a/schedule/week3/index.page-vue-render.js +++ b/schedule/week3/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('li',[_c('span',[_v("[CS2103 students only] Form teams duri with(this){return _c('div',[_c('p',[_c('strong',[_v("iP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_v("Do any leftover iP tasks from the previous week")])]),_v(" "),_c('li',[_c('span',[_v("Create a PR to the upstream repo")])]),_v(" "),_c('li',[_v("Add Increments as branches: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-7")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-8")])]),_v(" "),_c('li',[_v("Add Increments: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-MoreOOP")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Packages")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Gradle")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-JUnit")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Jar")])]),_v(" "),_c('li',[_v("Add Increments as parallel branches: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-JavaDoc")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-CodingStandard")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Level-9")])]),_v(" "),_c('li',[_c('span',[_v("[Optional] Get a head start on JavaFX")])])])]),_v(" "),_c('p',[_c('strong',[_v("tP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Individual Task")]),_v(": Explore AB3 features")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Sat, Aug 31st 23:59")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Team Task")]),_v(": Set up a project meeting time")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" by the end of the tutorial")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" "),_c('span',{staticClass:"dimmed"},[_v("Team Task")]),_v(": Check up on team's collective iP status")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Tue, Sep 3rd ")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week3/project.html b/schedule/week3/project.html index 25d40e7cc5..188657e332 100644 --- a/schedule/week3/project.html +++ b/schedule/week3/project.html @@ -190,7 +190,7 @@
    • The Java and Git standards to follow (for A-CodingStandard) are given in this page.
    • After finishing, assuming you encountered merge conflicts (and some were rather painful to resolve), think of how such conflicts could have been reduced (e.g., by changing the order of merging, or minimizing parallel branches when certain type of changes are being done to the code).
    Duke A-JavaDoc: JavaDoc

    Duke A-CodingStandard: Follow the Coding Standard

    Duke Level-9: Find

    6 [Optional] Get a head start on JavaFX

    If you can spare some time, start learning JavaFX by following the JavaFX tutorial @SE-EDU/guides. Doing so will make your life easier in the following week.

    tP: Kickoff

    Intro to tP Week 3

    This week, we kick off the tP with a few light individual and team tasks, described in the sections below.

    indicates an individual task (i.e., each team member has to do the task, graded individually)
    indicates a team task (i.e., some or all members may do the work; graded for the whole team).
    / indicates one-person-per-team task (i.e., one member can do the task on behalf of the team, although other members are welcome to pitch in).

    Stronger teams are welcome to stay one week ahead of the tP schedule. However, do not move ahead more than one week, as doing tP in a short burst will interfere with some of its learning outcomes.

    1 Individual Task: Explore AB3 features Sat, Aug 31st 23:59

    • Objectives: (1) To get each of you to think of ways to improve AB3 (2) To detect any Java version compatibility issues between your local set up and the expected Java version.

    • Submission: via Canvas survey named tP: AB3 Initial Experience by Sat, Aug 31st 23:59

    • Steps:

      1. Download the latest released version (i.e., the jar file) of AB3 from its upstream repo.
      2. Get it running in your computer. Play around with it to familiarize yourself with its current features.
      3. Add yourself to the list of contacts in AB3 (using the add ... command).
      4. Take a screenshot of the AB3 Window, while it shows your own contact info you added earlier. Save it as a .png file.
      5. Think about how the AB3 user experience can be improved, for example, by tweaking the command format, or the GUI, or the features. Note them down as a list of feature suggestions, as free text (i.e., no specific format).
        Suggested: Try to come up with at least 5 ways to improve AB3, while also trying to go beyond the simple/obvious ones (i.e., this is a chance to be insightful but also creative).
        Also keep the following tP constraints/recommendations in mind when doing this, as improvements that are not aligned with tP constraints are unlikely to be useful later.

    1. Use the Canvas survey mentioned above to submit the screenshot and the feature suggestions.
      -Note: The feature suggestions you submit will be shared with the team members later, so that your team can use them when designing the tP product later.

    2 Team Task: Set up a project meeting time by the end of the tutorial

    • After forming teams, set up a weekly project meeting time/venue (and communication channels) with your team members:

    3 Team Task: Check up on team's collective iP status Tue, Sep 3rd

    • Check with all team members if any of them needs help doing the iP, and source within the team to provide the needed help as much as you can e.g., offer to sit with them while they do the iP so that you can try to help when needed.
      Submission: After completing this task (i.e., after asking all team members if they need help for the iP, and coming up with a plan to help those who asked for help), one member should inform your tutor so that we can track the status of this task. We don't need to know who asked for help though e.g., One member is slightly behind and one significantly behind. We plan to have a code-together session on Sunday so that we can help them if they encounter problems.
    Mentorship within the team is highly-encouraged and rewarded. Besides, it is in your interest to help team members level up before the tP coding begins, and also, a good early opportunity to build team spirit.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Note: The feature suggestions you submit will be shared with the team members later, so that your team can use them when designing the tP product later.

    2 Team Task: Set up a project meeting time by the end of the tutorial

    • After forming teams, set up a weekly project meeting time/venue (and communication channels) with your team members:

    3 Team Task: Check up on team's collective iP status Tue, Sep 3rd

    • Check with all team members if any of them needs help doing the iP, and source within the team to provide the needed help as much as you can e.g., offer to sit with them while they do the iP so that you can try to help when needed.
      Submission: After completing this task (i.e., after asking all team members if they need help for the iP, and coming up with a plan to help those who asked for help), one member should inform your tutor so that we can track the status of this task. We don't need to know who asked for help though e.g., One member is slightly behind and one significantly behind. We plan to have a code-together session on Sunday so that we can help them if they encounter problems.
    Mentorship within the team is highly-encouraged and rewarded. Besides, it is in your interest to help team members level up before the tP coding begins, and also, a good early opportunity to build team spirit.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week3/project.page-vue-render.js b/schedule/week3/project.page-vue-render.js index 060e291c7c..bf36cfee0f 100644 --- a/schedule/week3/project.page-vue-render.js +++ b/schedule/week3/project.page-vue-render.js @@ -125,6 +125,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('ul',[_c('li',[_v("Check with all team members if any of them needs help doing the iP, and source within the team to provide the needed help as much as you can "),_c('span',{staticClass:"dimmed"},[_v("e.g., offer to sit with them while they do the iP so that you can try to help when needed.")]),_c('br'),_v(" "),_c('strong',[_v("Submission:")]),_v(" After completing this task (i.e., after asking all team members if they need help for the iP, and coming up with a plan to help those who asked for help), one member should "),_c('mark',[_v("inform your tutor")]),_v(" so that we can track the status of this task. We don't need to know who asked for help though e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("One member is slightly behind and one significantly behind. We plan to have a code-together session on Sunday so that we can help them if they encounter problems.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week3/topics.html b/schedule/week3/topics.html index 7cc64337c1..2b19a0d724 100644 --- a/schedule/week3/topics.html +++ b/schedule/week3/topics.html @@ -2342,7 +2342,7 @@ -

    In addition to Stubs, there are other type of replacements you can use during testing, e.g. Mocks, Fakes, Dummies, Spies.


    Resources:
    • Mocks Aren't Stubs by Martin Fowler -- An in-depth article about how Stubs differ from other types of test helpers.

    Exercises:

    Purpose of stubs



    Guidance for the item(s) below:

    While the JUnit concepts mentioned in the topic below are not strictly needed for the course projects, it is good to be aware of them so that you try some of them when applicable.

    W3.7f : OPTIONAL

    C++ to Java → JUnit → JUnit: Intermediate



    Similar to last week, most topics for this week are TIC2002 topics given here for reference. But there are some new topics too (they are marked by one of these icons: , , , : OPTIONAL)

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    In addition to Stubs, there are other type of replacements you can use during testing, e.g. Mocks, Fakes, Dummies, Spies.


    Resources:
    • Mocks Aren't Stubs by Martin Fowler -- An in-depth article about how Stubs differ from other types of test helpers.

    Exercises:

    Purpose of stubs



    Guidance for the item(s) below:

    While the JUnit concepts mentioned in the topic below are not strictly needed for the course projects, it is good to be aware of them so that you try some of them when applicable.

    W3.7f : OPTIONAL

    C++ to Java → JUnit → JUnit: Intermediate



    Similar to last week, most topics for this week are TIC2002 topics given here for reference. But there are some new topics too (they are marked by one of these icons: , , , : OPTIONAL)

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week3/topics.page-vue-render.js b/schedule/week3/topics.page-vue-render.js index 6ad1067ddd..15246e055e 100644 --- a/schedule/week3/topics.page-vue-render.js +++ b/schedule/week3/topics.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('div',{staticClass:"indented"},[_c('div')])} with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week3/tutorial.html b/schedule/week3/tutorial.html index def014da0a..de98c06d8e 100644 --- a/schedule/week3/tutorial.html +++ b/schedule/week3/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 3 [Mon, Aug 26th] - Tutorial

    As this is the first tutorial, given below are general details about our tutorials, in case you did not read that page before:

    Admin Tutorials


    0 [CS2103 students only] Form teams

    • Form teams, under the guidance of the tutor. See the panel below for team forming constrains and other related info.

    Admin Teams → Team Forming Constraints


    1 Introduce yourselves

    • Introduce yourself to the tutor and the members of your team and the partner team (i.e., the other team under your tutor)

    2 Find coding standard violations

    • Do the following exercise, if you have time.

    Find basic coding standard violations


    3 Decide a weekly project meeting time

    • If you haven't done so already, do the following tP task.

    4 Help team members troubleshoot iP problems

    • If there is time, do the following tP task (if there isn't enough time, you can do this later during the week).

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 3 [Mon, Aug 26th] - Tutorial

    As this is the first tutorial, given below are general details about our tutorials, in case you did not read that page before:

    Admin Tutorials


    0 [CS2103 students only] Form teams

    • Form teams, under the guidance of the tutor. See the panel below for team forming constrains and other related info.

    Admin Teams → Team Forming Constraints


    1 Introduce yourselves

    • Introduce yourself to the tutor and the members of your team and the partner team (i.e., the other team under your tutor)

    2 Find coding standard violations

    • Do the following exercise, if you have time.

    Find basic coding standard violations


    3 Decide a weekly project meeting time

    • If you haven't done so already, do the following tP task.

    4 Help team members troubleshoot iP problems

    • If there is time, do the following tP task (if there isn't enough time, you can do this later during the week).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week3/tutorial.page-vue-render.js b/schedule/week3/tutorial.page-vue-render.js index 87f23f5202..0be7b2c288 100644 --- a/schedule/week3/tutorial.page-vue-render.js +++ b/schedule/week3/tutorial.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ul',[_c('li',[_v("If you haven't done so already, do the f with(this){return _c('ul',[_c('li',[_v("If there is time, do the following tP task (if there isn't enough time, you can do this later during the week).")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week4/admin.html b/schedule/week4/admin.html index dd60d58310..7a186afcdf 100644 --- a/schedule/week4/admin.html +++ b/schedule/week4/admin.html @@ -13,7 +13,7 @@

    Week 4 [Mon, Sep 2nd] - Admin

    1. Accept GitHub invitation from the course organization
    2. Submit weekly quiz

    1 Accept GitHub invitation from the course organization

    • We will be adding you all to cs2103-AY2425S1 github org. Please accept the invitation sent by GitHub as you need to be a member of the org for some of the future course activities. If you did not receive the invitation link, you can use the link https://github.com/orgs/nus-cs2103-AY2425S1/invitation.
    • Worth 2 participation points

    2 Submit weekly quiz

    • Weekly quiz: Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline (i.e., before the following -weekly briefing).

    + Other info relevant to this week:

    FAQ Why very narrow project scope?


    FAQ Why can't I use my favorite tool/framework/language etc.?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +weekly briefing).

    + Other info relevant to this week:

    FAQ Why very narrow project scope?


    FAQ Why can't I use my favorite tool/framework/language etc.?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week4/admin.page-vue-render.js b/schedule/week4/admin.page-vue-render.js index 0314ac04d8..1edf1bcdb1 100644 --- a/schedule/week4/admin.page-vue-render.js +++ b/schedule/week4/admin.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',[_c('ul',[_c('li',[_v("We will be adding you all to c with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',[_v("Weekly quiz")]),_v(": Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline "),_c('span',{staticClass:"dimmed"},[_v("(i.e., before the following\nweekly briefing)")]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week4/index.html b/schedule/week4/index.html index 7b0dfe5759..e47d7ec1c5 100644 --- a/schedule/week4/index.html +++ b/schedule/week4/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 4 [Mon, Sep 2nd] - Summary

    [MUST-WATCH] Course Briefing Segment - tP (8 minutes)

    This week, we cover one more course briefing segment, given below. As with other course briefing segments, it is compulsory to watch.

    tP Briefing (Part 1 -- Getting Started)

    Video 9 mins

    As usual, the weekly briefing will be hybrid mode, and optional to attend/watch.


    We strongly recommend you to have a team project meeting before the tutorial. Keep notes of the meeting, and update project documents -- the tutor will ask for those during the tutorial.

    Do the following during the meeting:

    • Finish the tP tasks allocated for the week.
    • Help each other finish iP tasks. Tasks allocated to this week are especially troublesome and some peer help can be very useful.

    On a separate note, our guidelines on dealing with technical problems:

    Admin Appendix D: Getting Help


    Topics:

    • [W4.1] Design: Models

    • [W4.2] Class/Object Diagrams: Basics

    • [W4.3] Class Diagrams: Intermediate-Level

    • [W4.4] Java: JavaFX

    • [W4.5] Java: varargs

    • [W4.6] Code Quality: Naming

    • [W4.7] Static Analysis

    • [W4.8] Code reviews

    • [W4.9] RCS: Managing Pull Requests I

    Full ToC


    Admin:

    1. Accept GitHub invitation from the course organization
    2. Submit weekly quiz

    iP:

    1. Use GFMD in the PR description
    2. Review some peer PRs Fri, Sep 6th 1600
    3. Learn from others (optional)
    4. Add Increments as branches: A-CheckStyle, Level-10, A-Varargs

    tP:

    1. Start weekly project meetings
    2. Start a collaborative doc to take project notes before the tutorial
    3. Decide on an overall project direction (user profile, value proposition) decide by tutorial, submit by Sat

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 4 [Mon, Sep 2nd] - Summary

    [MUST-WATCH] Course Briefing Segment - tP (8 minutes)

    This week, we cover one more course briefing segment, given below. As with other course briefing segments, it is compulsory to watch.

    tP Briefing (Part 1 -- Getting Started)

    Video 9 mins

    As usual, the weekly briefing will be hybrid mode, and optional to attend/watch.


    We strongly recommend you to have a team project meeting before the tutorial. Keep notes of the meeting, and update project documents -- the tutor will ask for those during the tutorial.

    Do the following during the meeting:

    • Finish the tP tasks allocated for the week.
    • Help each other finish iP tasks. Tasks allocated to this week are especially troublesome and some peer help can be very useful.

    On a separate note, our guidelines on dealing with technical problems:

    Admin Appendix D: Getting Help


    Topics:

    • [W4.1] Design: Models

    • [W4.2] Class/Object Diagrams: Basics

    • [W4.3] Class Diagrams: Intermediate-Level

    • [W4.4] Java: JavaFX

    • [W4.5] Java: varargs

    • [W4.6] Code Quality: Naming

    • [W4.7] Static Analysis

    • [W4.8] Code reviews

    • [W4.9] RCS: Managing Pull Requests I

    Full ToC


    Admin:

    1. Accept GitHub invitation from the course organization
    2. Submit weekly quiz

    iP:

    1. Use GFMD in the PR description
    2. Review some peer PRs Fri, Sep 6th 1600
    3. Learn from others (optional)
    4. Add Increments as branches: A-CheckStyle, Level-10, A-Varargs

    tP:

    1. Start weekly project meetings
    2. Start a collaborative doc to take project notes before the tutorial
    3. Decide on an overall project direction (user profile, value proposition) decide by tutorial, submit by Sat

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week4/index.page-vue-render.js b/schedule/week4/index.page-vue-render.js index afacbdae9d..8e27326ded 100644 --- a/schedule/week4/index.page-vue-render.js +++ b/schedule/week4/index.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('p',[_c('strong',[_v("tP:")])])} with(this){return _c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Start weekly project meetings")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Start a collaborative doc to take project notes")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" before the tutorial")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Decide on an overall project direction "),_c('span',{staticClass:"dimmed"},[_v("(user profile, value proposition)")])]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" decide by tutorial, submit by Sat")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week4/project.html b/schedule/week4/project.html index ce443c9d44..6b5e4e2f2e 100644 --- a/schedule/week4/project.html +++ b/schedule/week4/project.html @@ -62,7 +62,7 @@
    • Details to submit:
      1. Product name (plain text only) e.g., ClientContactsPro
      2. Target user profile (plain text only) e.g., freelance event photographers
        This is a general description of the target user, not the 'persona' you defined (the latter serves as a concrete representation of the target user, for your internal use only).
      3. Value proposition i.e., what problem does the product solve? (plain text paragraph, no more than 50 words) e.g., provide fast access to client contact details, optimized for users who prefer a CLI
        -This is not a list of features -- you should not think about exact features yet.
      4. Link to the project notes document: This should be an online document/page (not a folder) -- e.g., a GoogleDoc (not a Google Drive location) -- that is publicly accessible. If your project notes are in multiple locations/files, this one document should contain the link to the other documents with guidance on which link is for what.
    • You'll receive an email from TEAMMATES with the submission link. Only one member needs to submit on behalf of the team. All members can view/update the submission.
    • Submission link will be sent to you by Thu, Sep 5th (reason: we need a few days to set up the submission system after teams have been finalized).
      If you can't find the submission link, you can go to TEAMMATES link recovery page and enter your NUSNET email account e_______@u.nus.edu to get TEAMMATES to resend the link.

    FAQ Can we change the target user and value proposition later in the project?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +This is not a list of features -- you should not think about exact features yet.
  • Link to the project notes document: This should be an online document/page (not a folder) -- e.g., a GoogleDoc (not a Google Drive location) -- that is publicly accessible. If your project notes are in multiple locations/files, this one document should contain the link to the other documents with guidance on which link is for what.
  • You'll receive an email from TEAMMATES with the submission link. Only one member needs to submit on behalf of the team. All members can view/update the submission.
  • Submission link will be sent to you by Thu, Sep 5th (reason: we need a few days to set up the submission system after teams have been finalized).
    If you can't find the submission link, you can go to TEAMMATES link recovery page and enter your NUSNET email account e_______@u.nus.edu to get TEAMMATES to resend the link.
  • FAQ Can we change the target user and value proposition later in the project?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week4/project.page-vue-render.js b/schedule/week4/project.page-vue-render.js index 22c1e7a505..71f36c55b7 100644 --- a/schedule/week4/project.page-vue-render.js +++ b/schedule/week4/project.page-vue-render.js @@ -116,6 +116,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Decide the target user prof with(this){return _c('ul',[_c('li',[_c('span',{staticClass:"text-danger"},[_c('strong',[_v("Submission")]),_v(":")]),_v(" Submit via TEAMMATES.\n"),_c('ul',[_c('li',[_v("Details to submit:\n"),_c('ol',[_c('li',[_c('strong',[_v("Product name")]),_v(" (plain text only) "),_c('span',{staticClass:"dimmed"},[_v("e.g., ClientContactsPro")])]),_v(" "),_c('li',[_c('strong',[_v("Target user")]),_v(" profile (plain text only) "),_c('span',{staticClass:"dimmed"},[_v("e.g., freelance event photographers")]),_c('br'),_v("\nThis is a general description of the target user, "),_c('span',{staticClass:"text-danger"},[_v("not the 'persona' you defined")]),_v(" (the latter serves as a concrete representation of the target user, for your internal use only).")]),_v(" "),_c('li',[_c('strong',[_v("Value proposition")]),_v(" i.e., what problem does the product solve? (plain text paragraph, "),_c('span',{staticClass:"text-danger"},[_v("no more than 50 words")]),_v(") "),_c('span',{staticClass:"dimmed"},[_v("e.g., provide fast access to client contact details, optimized for users who prefer a CLI")]),_c('br'),_v("\nThis is "),_c('mark',[_v("not a list of features")]),_v(" -- you should not think about exact features yet.")]),_v(" "),_c('li',[_c('strong',[_v("Link to the project notes document")]),_v(": This should be an online document/page (not a folder) -- e.g., a GoogleDoc (not a Google Drive location) -- that is publicly accessible. If your project notes are in multiple locations/files, this one document should contain the link to the other documents with guidance on which link is for what.")])])]),_v(" "),_c('li',[_v("You'll receive an email from TEAMMATES with the submission link. "),_c('mark',[_v("Only one member needs to submit")]),_v(" on behalf of the team. All members can view/update the submission.")]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" Submission link will be sent to you by Thu, Sep 5th "),_c('span',{staticClass:"dimmed"},[_v("(reason: we need a few days to set up the submission system "),_c('em',[_v("after")]),_v(" teams have been finalized)")]),_v("."),_c('br'),_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" If you can't find the submission link, you can go to "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("TEAMMATES link recovery page")]),_v(" and enter your NUSNET email account "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e_______@u.nus.edu")]),_v(" to get TEAMMATES to resend the link.")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week4/topics.html b/schedule/week4/topics.html index 50c5c468bf..c4772ac69d 100644 --- a/schedule/week4/topics.html +++ b/schedule/week4/topics.html @@ -273,7 +273,7 @@ - LGTM is often used in such overall comments, to indicate Looks good to me (or Looks good to merge).
    nit (as in nit-picking) is another such term, used to indicate minor flaws e.g., LGTM. Just a few nits to fix..
  • Choose Approve, Comment, or Request changes option as appropriate and click on the Submit review button.


  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    + LGTM is often used in such overall comments, to indicate Looks good to me (or Looks good to merge).
    nit (as in nit-picking) is another such term, used to indicate minor flaws e.g., LGTM. Just a few nits to fix..
  • Choose Approve, Comment, or Request changes option as appropriate and click on the Submit review button.


  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week4/topics.page-vue-render.js b/schedule/week4/topics.page-vue-render.js index be0dd326f4..116f389d9f 100644 --- a/schedule/week4/topics.page-vue-render.js +++ b/schedule/week4/topics.page-vue-render.js @@ -62,6 +62,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week4/tutorial.html b/schedule/week4/tutorial.html index 980f60ce09..dddc9dcfe5 100644 --- a/schedule/week4/tutorial.html +++ b/schedule/week4/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 4 [Mon, Sep 2nd] - Tutorial

    1 Discuss iP progress

    • If you managed to add a GUI to your app, demo it to others.

    2 Interpret class/object diagrams

    • Do the first of the two exercise given below, as directed by the tutor. If there is time left, do the second one as well.

    Are you able to interpret CD/OD notations?

    Study the following class and object diagrams. Are you able to interpret all notations?


    Explain notations in the class diagram


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 4 [Mon, Sep 2nd] - Tutorial

    1 Discuss iP progress

    • If you managed to add a GUI to your app, demo it to others.

    2 Interpret class/object diagrams

    • Do the first of the two exercise given below, as directed by the tutor. If there is time left, do the second one as well.

    Are you able to interpret CD/OD notations?

    Study the following class and object diagrams. Are you able to interpret all notations?


    Explain notations in the class diagram


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week4/tutorial.page-vue-render.js b/schedule/week4/tutorial.page-vue-render.js index 0c9587b7f3..fce359e137 100644 --- a/schedule/week4/tutorial.page-vue-render.js +++ b/schedule/week4/tutorial.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('ul',[_c('li',[_v("If you managed to add a GUI to your app, with(this){return _c('ul',[_c('li',[_v("Do the first of the two exercise given below, as directed by the tutor. If there is time left, do the second one as well.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week5/admin.html b/schedule/week5/admin.html index ded58242c8..93d9642a11 100644 --- a/schedule/week5/admin.html +++ b/schedule/week5/admin.html @@ -15,7 +15,7 @@

    Week 5 [Mon, Sep 9th] - Admin

    1. Submit weekly quiz
    2. [optional] Submit midterm feedback for the course Sat, Sep 14th 2359
    3. Prelim peer evaluation on TEAMMATES Thu, Sep 12th 2359

    1 Submit weekly quiz

    • Weekly quiz: Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline (i.e., before the following weekly briefing).

    2 [optional] Submit midterm feedback for the course Sat, Sep 14th 2359

    • An anonymous survey to submit feedback about the course and the teaching team will open on Canvas by Monday. Please take a few minutes to give us your feedback.

    3 Prelim peer evaluation on TEAMMATES Thu, Sep 12th 2359

    • You should receive the submission link by Monday noon.
      If you did not receive the submission link, you can get TEAMMATES to resend the link by going to TEAMMATES link recovery page and entering your NUSNET email address (try the e______@u.nus.edu before trying the 'friendly' email address). Remember to check your spam folder as well.

    The deadline for this task is strict, unlike the deadline for other weekly project work.

    Admin Peer Evaluations → Session: Prelim Peer Evaluation

    Session: Prelim Peer Evaluation

    • Objective: to give you a chance to give early feedback to team members, but also, a chance to familiarize with the TEAMMATES tool.

    • Submission is compulsory. Ratings/responses you receive will not be considered for grading .
      -Although this is done early in the project timeline, we recommend that you give sincere/accurate feedback to others as much as possible.

    • Held early in the semester.

    • The questions in this session are similar to the Midterm Peer Evaluation, but has the following additional question:

      Q How much do you plan to contribute to the team project?

      • An equal share
      • A bit more than an equal share
      • A lot more than an equal share
      • A bit less than an equal share (e.g., due to other commitments)
      • A lot less than an equal share
      • Can only do the bare minimum to pass

    + Other info relevant to this week:

    Admin tP: Grading

    FAQ Why so much bean counting?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Although this is done early in the project timeline, we recommend that you give sincere/accurate feedback to others as much as possible.

  • Held early in the semester.

  • The questions in this session are similar to the Midterm Peer Evaluation, but has the following additional question:

    Q How much do you plan to contribute to the team project?

    • An equal share
    • A bit more than an equal share
    • A lot more than an equal share
    • A bit less than an equal share (e.g., due to other commitments)
    • A lot less than an equal share
    • Can only do the bare minimum to pass

  • + Other info relevant to this week:

    Admin tP: Grading

    FAQ Why so much bean counting?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week5/admin.page-vue-render.js b/schedule/week5/admin.page-vue-render.js index 298e4c8268..75b30cb71d 100644 --- a/schedule/week5/admin.page-vue-render.js +++ b/schedule/week5/admin.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('ul',[_c('li',[_v("You should receive the submission link by Monday noon."),_c('br'),_c('span',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" If you did not receive the submission link, you can get TEAMMATES to resend the link by going to "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("TEAMMATES link recovery page")]),_v("\nand entering your NUSNET email address (try the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e______@u.nus.edu")]),_v(" before trying the 'friendly' email address). Remember to check your spam folder as well.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week5/index.html b/schedule/week5/index.html index 728883c464..82736b998c 100644 --- a/schedule/week5/index.html +++ b/schedule/week5/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 5 [Mon, Sep 9th] - Summary

    Topics:

    • [W5.1] Requirements: Intro

    • [W5.2] Requirements: Gathering

    • [W5.3] Requirements: Specifying

    • [W5.8] RCS: Managing Pull Requests II

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [optional] Submit midterm feedback for the course Sat, Sep 14th 2359
    3. Prelim peer evaluation on TEAMMATES Thu, Sep 12th 2359

    iP:

    1. Generate a new JAR file
    2. Write some full commit messages
    3. Add Increments as PRs: A-Assertions, A-CodeQuality, A-Streams
    4. Add Increment: A-CI
    5. Add an extension

    tP:

    1. Brainstorm user stories before the tutorial
    2. Choose user stories for the MVP version before/during the tutorial

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 5 [Mon, Sep 9th] - Summary

    Topics:

    • [W5.1] Requirements: Intro

    • [W5.2] Requirements: Gathering

    • [W5.3] Requirements: Specifying

    • [W5.8] RCS: Managing Pull Requests II

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. [optional] Submit midterm feedback for the course Sat, Sep 14th 2359
    3. Prelim peer evaluation on TEAMMATES Thu, Sep 12th 2359

    iP:

    1. Generate a new JAR file
    2. Write some full commit messages
    3. Add Increments as PRs: A-Assertions, A-CodeQuality, A-Streams
    4. Add Increment: A-CI
    5. Add an extension

    tP:

    1. Brainstorm user stories before the tutorial
    2. Choose user stories for the MVP version before/during the tutorial

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week5/index.page-vue-render.js b/schedule/week5/index.page-vue-render.js index ccd230298b..f884d8bbb3 100644 --- a/schedule/week5/index.page-vue-render.js +++ b/schedule/week5/index.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('span',{staticClass:"badge bg-danger font-weight-normal"}, with(this){return _c('div',[_c('p',[_c('strong',[_v("iP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_v("Generate a new JAR file")])]),_v(" "),_c('li',[_c('span',[_v("Write some full commit messages")])]),_v(" "),_c('li',[_v("Add Increments as PRs: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Assertions")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-CodeQuality")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Streams")])]),_v(" "),_c('li',[_v("Add Increment: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-CI")])]),_v(" "),_c('li',[_c('span',[_v("Add an extension")])])])]),_v(" "),_c('p',[_c('strong',[_v("tP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Brainstorm user stories")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" before the tutorial")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Choose user stories for the MVP version")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" before/during the tutorial")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week5/project.html b/schedule/week5/project.html index f242860214..b3587429da 100644 --- a/schedule/week5/project.html +++ b/schedule/week5/project.html @@ -153,7 +153,7 @@

  • User stories for what version? At this stage, collect user stories to cover at least the final version you hope to deliver at the end of the semester. It is OK to go even beyond that (reason: we are simulating a project that will continue even after the semester is over).
    Do not omit user stories already covered by the features in AB3 i.e., the user story should be recorded even if AB3 already caters for it.

  • How many user stories? Aim to collect more user stories than you can deliver in the project. Aim to create at least 30 user stories. Include all 'obvious' ones you can think of but also look for 'non obvious' ones that you think are likely to be missed by other competing products.

  • User stories of what size? Normally, it is fine to use epic-level user stories in the early stages of a project but given this is a small project, you may want to eventually break them down to smaller user stories (i.e., small enough for one person to implement in 1-2 days). Some examples (from the iP product domain):

    • Bad As a user, I can track my schedule, so that I can know when to do things.
      Reason: too big, as track can involve a lot of things.
    • Good As a user, I can add a time to a task, so that I can record when a task need to be done.
    • Good As a user, I can see the pending task that has the next earliest deadline, so that I can know what I need to do next.
  • What format?: You may use a sentence format or a table format but do maintain the prescribed three-part structure of a user story. In particular, try to include the benefit part in most user stories as that will come in handy when prioritizing user stories later.

  • Submission (to be checked by the tutor later):

    • Intermediate steps (e.g., persona, scenarios): Keep records these in your collaborative project document started in the previous week.
    • Brainstormed user stories: Record them using an online tool (some examples given in [Textbook Specifying Requirements → UserStories → Usage → (panel) Tool Examples ]).
      Use an online spreadsheet for recording user stories (e.g., Google Sheets), if you are not sure which tool to use. -- they are easy to edit, share, color, and more importantly, sort/filter.
      If you put the user stories in a page/file other than your main collaborative project notes document (i.e., the one given here), ensure that page/file is viewable by the public, and the main document has a link to that page/file. Otherwise, the tutor will not be able to see your list of user stories.
  • If you choose to use the GitHub issue tracker to manage user stories, you need to set up your team's GitHub organization, team repo, and its issue tracker first. Instructions for doing those steps are in the panel below.

    2 Choose user stories for the MVP version before/during the tutorial

    Task: Of the user stories you have collected, select the ones you would put in an version of the product. The goal here is to come up with the smallest possible product that is still usable so that it can be implemented quickly, and delivered at the end of an earlier iteration.

    • Try to limit the MVP to strictly must-have user stories only i.e., it's NOT what you can or want to put in the MVP, but what you must have in the MVP. If the product can be of some use without a given user story, that user story should be left out of the MVP version, even if the omission makes the product hard to use, as long as the product is not impossible to use e.g., in most cases a product can be used without an 'edit item' feature because the user can always delete an item and add a new item instead of editing an existing an item.

    • Do not discuss features, UI, command format, or implementation details yet. That would be like putting the cart before the horse. At this stage we are simply trying to choose which user needs to fulfill first.

    • Don't worry about subsequent versions or the final version. You can design them at a later time.

    • Don't worry about MVP being 'too small'. You can always add more features to the MVP version if you finish it ahead of schedule.
      You can also select an additional set of user stories that are nice-to-have for the MVP, to be done but only if there's time left.

    • In the interest of keeping the MVP small, you can narrow the scope of MVP further e.g., narrower target user, a smaller value proposition.

    • Suggested workflow:

      1. First stage:
        • Divide the user stories among team members.
        • Each member will go through their user stories to discard (e.g., cross out, or move to a different location, but not delete) which are definitely not needed for MVP.
      2. Second stage: -
        • All members discuss the remaining user stories (i.e., the ones not discarded in the first stage), and try to trim the list further.

    FAQ What if the chosen user stories for MVP is not enough to do a meaningful work division among team members?


    FAQ Should we start implementing MVP now?


    FAQ Should we omit user stories that are already supported by AB3?


    FAQ All the user stories we selected for MVP are already supported by AB3. What now?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • All members discuss the remaining user stories (i.e., the ones not discarded in the first stage), and try to trim the list further.

    FAQ What if the chosen user stories for MVP is not enough to do a meaningful work division among team members?


    FAQ Should we start implementing MVP now?


    FAQ Should we omit user stories that are already supported by AB3?


    FAQ All the user stories we selected for MVP are already supported by AB3. What now?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week5/project.page-vue-render.js b/schedule/week5/project.page-vue-render.js index bc67966a13..1edd6e8557 100644 --- a/schedule/week5/project.page-vue-render.js +++ b/schedule/week5/project.page-vue-render.js @@ -143,6 +143,6 @@ with(this){return _c('li',[_c('p',[_c('strong',[_v("In the interest of keeping t with(this){return _c('li',[_c('p',[_c('strong',[_v("Suggested workflow:")])]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("First stage")]),_v(":\n"),_c('ul',[_c('li',[_v("Divide the user stories among team members.")]),_v(" "),_c('li',[_v("Each member will go through their user stories to discard (e.g., cross out, or move to a different location, but not delete) which are "),_c('em',[_v("definitely not needed")]),_v(" for MVP.")])])]),_v(" "),_c('li',[_c('strong',[_v("Second stage")]),_v(":\n"),_c('ul',[_c('li',[_v("All members discuss the remaining user stories (i.e., the ones not discarded in the first stage), and try to trim the list further.")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week5/topics.html b/schedule/week5/topics.html index 0a1903720b..2b38c9a683 100644 --- a/schedule/week5/topics.html +++ b/schedule/week5/topics.html @@ -2144,7 +2144,7 @@ Preconditions, Postconditions, and Class Invariants. Refer to Programming with Assertions (second half) to learn more.

    Exceptions and assertions are two complementary ways of handling errors in software but they serve different purposes. Therefore, both assertions and exceptions should be used in code.

    • The raising of an exception indicates an unusual condition created by the user (e.g. user inputs an unacceptable input) or the environment (e.g., a file needed for the program is missing).
    • An assertion failure indicates the programmer made a mistake in the code (e.g., a null value is returned from a method that is not supposed to return null under any circumstances).

    Exercises:

    Assertion failure in Calculator


    Statement about exceptions and assertions




    [W5.7] Java: streams

    W5.7a :

    C++ to Java → Miscellaneous Topics → Streams: Basic

    Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds





    [W5.8] RCS: Managing Pull Requests II

    W5.8a

    Tools → Git and GitHub → Merging PRs

    Can review and merge PRs on GitHub

    Let's look at the steps involved in merging a PR, assuming the PR has been reviewed, refined, and approved for merging already.

    Preparation: If you would like to try merging a PR yourself, you can create a dummy PR in the following manner.

    1. Fork any repo (e.g., samplerepo-pr-practice).
    2. Clone in to your computer.
    3. Create a new branch e.g., (feature1) and add some commits to it.
    4. Push the new branch to the fork.
    5. Create a PR from that branch to the master branch in your fork. Yes, it is possible to create a PR within the same repo.

    1. Locate the PR to be merged in your repo's GitHub page.

    2. Click on the Conversation tab and scroll to the bottom. You'll see a panel containing the PR status summary.

    3. If the PR is not merge-able in the current state, the Merge pull request will not be green. Here are the possible reasons and remedies:

    • Problem: The PR code is out-of-date, indicated by the message This branch is out-of-date with the base branch. That means the repo's master branch has been updated since the PR code was last updated.
      • If the PR author has allowed you to update the PR and you have sufficient permissions, GitHub will allow you to update the PR simply by clicking the Update branch on the right side of the 'out-of-date' error message. If that option is not available, post a message in the PR requesting the PR author to update the PR.
    • Problem: There are merge conflicts, indicated by the message This branch has conflicts that must be resolved. That means the repo's master branch has been updated since the PR code was last updated, in a way that the PR code conflicts with the current master branch. Those conflicts must be resolved before the PR can be merged. -
      • If the conflicts are simple, GitHub might allow you to resolve them using the Web interface.
      • If that option is not available, post a message in the PR requesting the PR author to update the PR.

    3. Merge the PR by clicking on the Merge pull request button, followed by the Confirm merge button. You should see a Pull request successfully merged and closed message after the PR is merged.

    • You can choose between three merging options by clicking on the down-arrow in the Merge pull request button. If you are new to Git and GitHub, the Create merge commit option is recommended.

    Next, sync your local repos (and forks). Merging a PR simply merges the code in the upstream remote repository in which it was merged. The PR author (and other members of the repo) needs to pull the merged code from the upstream repo to their local repos and push the new code to their respective forks to sync the fork with the upstream repo.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • If the conflicts are simple, GitHub might allow you to resolve them using the Web interface.
    • If that option is not available, post a message in the PR requesting the PR author to update the PR.

    3. Merge the PR by clicking on the Merge pull request button, followed by the Confirm merge button. You should see a Pull request successfully merged and closed message after the PR is merged.

    • You can choose between three merging options by clicking on the down-arrow in the Merge pull request button. If you are new to Git and GitHub, the Create merge commit option is recommended.

    Next, sync your local repos (and forks). Merging a PR simply merges the code in the upstream remote repository in which it was merged. The PR author (and other members of the repo) needs to pull the merged code from the upstream repo to their local repos and push the new code to their respective forks to sync the fork with the upstream repo.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week5/topics.page-vue-render.js b/schedule/week5/topics.page-vue-render.js index dd62cceb9c..ba2167ef74 100644 --- a/schedule/week5/topics.page-vue-render.js +++ b/schedule/week5/topics.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('div',{staticClass:"indented"},[_c('div')])} with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week5/tutorial.html b/schedule/week5/tutorial.html index dd3865da5e..a49d141248 100644 --- a/schedule/week5/tutorial.html +++ b/schedule/week5/tutorial.html @@ -16,7 +16,7 @@

    You can use the following setting to try the two different views available and pick the one you like.
  • 10 minutes Discussion: The tutor will lead a short discussion to go through the problematic code you found.

  • After the tutorial, you can apply the insights gained from this activity to improve the code quality of your own iP, if necessary.

    You are not required to (but welcome to) post review comments in the PRs you examined.
  • 2 User stories exercise

    • Consider the following user stories a team came up with, for a tP that aims to build a software for tracking travel plans.
    1 As a … I can … So that I can … notes
    2 first-time user see some sample trips when I open the app easily try out its features without needing to add my data first
    3 first-time user see a help message explaining which features I should try first start by trying features that are more suited for new users e.g., "hey you seem to be new. Try adding a trip first"
    4 new user ready to adopt the app for my own use purge all data get rid of sample/dummy data and start adding my real data
    5 busy user track all trip-related data inside the app save time looking for data
    6 user sending trip info to friends via email or telegram
    7 user add a trip
    8 user delete a trip get rid of trip no longer needed to track
    9 user edit trip details correct mistakes I made when adding a trip
    10 user view all trip details recall details of trips
    11 user see the next upcoming trip details when I open the app save the step of searching for the trip reason: the next upcoming trips is the most likely trip the user may want to see
    • Think of the answers to the following questions. These will be discussed during the tutorial. -
      1. Which user stories don’t follow the correct format?
      2. Any of them too big for the tP planning? i.e., cannot be implemented by one person within 1-2 days
      3. Which are must-have features i.e., impossible to use the app without it

    3 Prioritize tP user stories

    1. If you haven't done so already, brainstorm for user stories.

    1. If you want to refine your user stories (based on what you learned from the tutorial activity above) that you brainstormed earlier, do that first.

    2. If you haven't done so already, prioritize tP user stories as explained in the panel below.

    4 time permitting Create a feature list for the MVP version

    • If there is time left, do the following tP task that is scheduled for the following week.

    Admin tP → week 6 → Conceptualize the MVP version

    • Task: Based on your user stories selected previously, conceptualize the MVP in the form of a feature list.
    • Why?: So far, we have user stories we want to include in the MVP version. But user stories simply tell us user needs. To move towards a product design, we need to design product features of the product can fulfill those user needs.

    • Submission: Note down the feature list in your online project notes document.

    FAQ How many features should we put in the MVP?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    1. Which user stories don’t follow the correct format?
    2. Any of them too big for the tP planning? i.e., cannot be implemented by one person within 1-2 days
    3. Which are must-have features i.e., impossible to use the app without it

    3 Prioritize tP user stories

    1. If you haven't done so already, brainstorm for user stories.

    1. If you want to refine your user stories (based on what you learned from the tutorial activity above) that you brainstormed earlier, do that first.

    2. If you haven't done so already, prioritize tP user stories as explained in the panel below.

    4 time permitting Create a feature list for the MVP version

    • If there is time left, do the following tP task that is scheduled for the following week.

    Admin tP → week 6 → Conceptualize the MVP version

    • Task: Based on your user stories selected previously, conceptualize the MVP in the form of a feature list.
    • Why?: So far, we have user stories we want to include in the MVP version. But user stories simply tell us user needs. To move towards a product design, we need to design product features of the product can fulfill those user needs.

    • Submission: Note down the feature list in your online project notes document.

    FAQ How many features should we put in the MVP?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week5/tutorial.page-vue-render.js b/schedule/week5/tutorial.page-vue-render.js index 47e0b99c05..e07fa3d44c 100644 --- a/schedule/week5/tutorial.page-vue-render.js +++ b/schedule/week5/tutorial.page-vue-render.js @@ -47,6 +47,6 @@ with(this){return _c('ol',{attrs:{"start":"2"}},[_c('li',[_c('p',[_v("If you wan with(this){return _c('ul',[_c('li',[_v("If there is time left, do the following tP task that is scheduled for the following week.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week6/admin.html b/schedule/week6/admin.html index 5426320c45..02407112fc 100644 --- a/schedule/week6/admin.html +++ b/schedule/week6/admin.html @@ -13,7 +13,7 @@

    Week 6 [Mon, Sep 16th] - Admin

    1. Submit weekly quiz

    1 Submit weekly quiz

    • Weekly quiz: Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline (i.e., before the following -weekly briefing).

    + Other info relevant to this week:

    Admin Apdx F: Handling Team Issues : OPTIONAL

    FAQ Why so many small submissions?


    FAQ Why submission requirements differ between CS2103T and CS2101?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +weekly briefing).

    + Other info relevant to this week:

    Admin Apdx F: Handling Team Issues : OPTIONAL

    FAQ Why so many small submissions?


    FAQ Why submission requirements differ between CS2103T and CS2101?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week6/admin.page-vue-render.js b/schedule/week6/admin.page-vue-render.js index 5017739b23..6acd284e81 100644 --- a/schedule/week6/admin.page-vue-render.js +++ b/schedule/week6/admin.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"week-6-mon-sep-16th-admin"}},[_v("Week 6 with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',[_v("Weekly quiz")]),_v(": Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline "),_c('span',{staticClass:"dimmed"},[_v("(i.e., before the following\nweekly briefing)")]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week6/index.html b/schedule/week6/index.html index df06674389..d1137418da 100644 --- a/schedule/week6/index.html +++ b/schedule/week6/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 6 [Mon, Sep 16th] - Summary

    Topics:

    • [W6.1] Modeling: Sequence Diagrams

    • [W6.2] Architecture Diagrams

    • [W6.3] IDEs: Intermediate Features

    • [W6.4] Logging

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. Add Increments: A-BetterGui, A-Personality, A-MoreErrorHandling, A-MoreTesting, A-AiAssisted
    2. Finalize the features
    3. Set up a product website
    4. Submit the final version Fri, Sep 20th 2359

    tP:

    1. Conceptualize the MVP version
    2. Draft the feature specification Sun, Sep 22nd 23:59
    3. Set up the project repo
    4. Get familiar with the codebase

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 6 [Mon, Sep 16th] - Summary

    Topics:

    • [W6.1] Modeling: Sequence Diagrams

    • [W6.2] Architecture Diagrams

    • [W6.3] IDEs: Intermediate Features

    • [W6.4] Logging

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. Add Increments: A-BetterGui, A-Personality, A-MoreErrorHandling, A-MoreTesting, A-AiAssisted
    2. Finalize the features
    3. Set up a product website
    4. Submit the final version Fri, Sep 20th 2359

    tP:

    1. Conceptualize the MVP version
    2. Draft the feature specification Sun, Sep 22nd 23:59
    3. Set up the project repo
    4. Get familiar with the codebase

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week6/index.page-vue-render.js b/schedule/week6/index.page-vue-render.js index 5a77d77963..89eace054a 100644 --- a/schedule/week6/index.page-vue-render.js +++ b/schedule/week6/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('p',[_c('strong',[_v("Admin:")])])} with(this){return _c('div',[_c('p',[_c('strong',[_v("iP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_v("Add Increments: "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-BetterGui")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-Personality")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-MoreErrorHandling")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-MoreTesting")]),_v(", "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("A-AiAssisted")])]),_v(" "),_c('li',[_c('span',[_v("Finalize the features")])]),_v(" "),_c('li',[_c('span',[_v("Set up a product website")])]),_v(" "),_c('li',[_c('span',[_v("Submit the final version")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Fri, Sep 20th 2359")])])])])]),_v(" "),_c('p',[_c('strong',[_v("tP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Conceptualize the MVP version")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Draft the feature specification")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Sun, Sep 22nd 23:59")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Set up the project repo")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Get familiar with the codebase")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week6/project.html b/schedule/week6/project.html index fc57434aa1..34fece2cfb 100644 --- a/schedule/week6/project.html +++ b/schedule/week6/project.html @@ -23,7 +23,7 @@
    • Which formats are allowed for dates, times, telephone numbers, etc.?
    • How does extra/leading/trailing spaces affect the value -- for instance is 'John Doe' same as 'John   Doe' (note the multiple spaces in the middle of the name)?
    • How does UPPER/lower case affects values -- is John Doe same as john doe?
    • It's not enough to state 'valid name'; you need to specify what rules will be used to determine if the input is a valid name.
  • Error message if the value is not acceptable
  • Rationale for any the validity rule e.g., why only certain characters are allowed for person names?
  • Yes, making these decisions is not easy -- and that's why we want you to think about them now rather than later. Feel free to discuss these validation rules in the forum.

    Outputs: Precise expected outputs when the command,

    • succeeds e.g., changes in the GUI, messages shown to the user
    • fails e.g., what are the error messages shown when a specific parameter is invalid, missing, specified multiple times, etc.

    Duplicate handling: What rules are used to determine if two contacts are duplicates? e.g., is having the same name enough for two contacts to be considered duplicates, or all details need to be the same?
    How does the application react to such duplicate entries? Reject or accept? Why?

    Relevant UI mock-ups (unless the UI will be exactly the same as AB3): they can be hand-drawn or created using a tool such as PowerPoint, PlantUML, Figma, etc. -- they can be very low-fidelity mock-ups, as they are meant to be temporary


    Recommended: Decide priorities of finer aspects of features, for example, as must-have (to implement in the MVP) and nice-to-have (i.e., to implement in the MVP only if there is time)
    e.g., you can decide one date format that is to be supported in user commands as must-have and two other formats as nice-to-have.

    • It is OK to make compromises when making product decisions -- every design option has costs and benefits, and sometimes, costs outweigh the benefits.
      For example, it is fine to restrict the person name to a certain length and a character set even if it is theoretically possible for those restrictions to conflict with some rare real-world person names. But you need to be aware of such conflicts, justify the restriction (e.g., ease of implementation/display), and know how users can work around such a conflict should they encounter it (e.g., if you app doesn't allow two contacts to have the same name but the user need to store two contacts which are different people with the same name, what should the user do?).

    • You are welcome to (but not required to) follow AB3 when defining the behavior of the new features e.g., use similar command formats, input validation rules, error message formats.

    FAQ Do we need to include existing AB3 features in the MVP feature spec?


    • Ensure feature-fit: While doing this, ensure the features written by each member fit together to form a cohesive product, and meet other grading criteria of the product design aspect. This might require several rounds of refinement. You are encouraged to peer-review feature details written by other team members and refine the overall product design together.

    • Submission [one person per team]: Save the file as a PDF file, name it {team-id}.pdf e.g., CS2103-T09-2.pdf, and upload to Canvas.
    • Grading criteria: to be considered 'done', the feature spec. should meet all the following criteria: -
      • Covers all features in the smallest set of features the product cannot do without.
      • Contains all details mentioned above for each of those features
      • Details seem well-thought-out (i.e., not a half-hearted attempt to satisfy the expected level of details)

    Recommended: Divide among team members so that each person does a non-trivial amount of documentation; preferably based on enhancements/features each person would be adding e.g., If you are the person planing to add a feature X, you should be the person to describe the feature X in the User Guide and in the Developer Guide.

    Reason: In the final project evaluation your documentation skills will be graded based on sections of the User/Developer Guide you wrote.

    If you are not sure what we mean by 'enhancements/features each person would be adding' mentioned above, see the panel below for our recommendation on how to divide the tP work:

    3 Set up the project repo

    1. [/ one member] Set up the team org:
      While only one member needs to do this, it may be useful to do this as a team while that member is screensharing, so that others get to see how it is done too.

    1. [/ one member] Set up the team repo (including the issue tracker):

    1. [ each member] Set up individual forks:

    4 Get familiar with the codebase

    FAQ Is this a team task or an individual task?


    Ideally, you should do this task in this week, but you may take an extra week (i.e., by week 7) to finish.

    • Do the following tutorials to get familiar with the codebase

    Tutorial 1 - Tracing a Command Execution Path

    See here for details.

    We recommend that you put in a sincere effort into this tutorial because tracing through the code of an unfamiliar codebase is an important skill that you can learn by doing so; you will not be able to learn/practice later in the project as the code will no longer be 'unfamiliar' to you later.

    Submission [optional]: Post an issue in your team's repo with the title Tutorial: tracing code. In the description, add a 2-3 screenshots you took while at various points of the tutorial. You may close the issue soon after.


    Tutorial 2 - Adding a new Command

    See here for details.

    If you are an experienced programmer, you can add a different command than the one given in the tutorial.

    Submission: Do your changes in a branch named tutorial-adding-command, push to your fork, and create a PR from your fork's tutorial-adding-command branch to your team repo's master branch. You may close the PR soon after.

    FAQ When doing this tP tutorial, do we have to write/update test cases too?



    Tutorial 3 - Removing a field from an entity

    See here for details.

    This tutorial is optional to do, but at least give it a quick read.

    Submission: not required.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Covers all features in the smallest set of features the product cannot do without.
    • Contains all details mentioned above for each of those features
    • Details seem well-thought-out (i.e., not a half-hearted attempt to satisfy the expected level of details)

    Recommended: Divide among team members so that each person does a non-trivial amount of documentation; preferably based on enhancements/features each person would be adding e.g., If you are the person planing to add a feature X, you should be the person to describe the feature X in the User Guide and in the Developer Guide.

    Reason: In the final project evaluation your documentation skills will be graded based on sections of the User/Developer Guide you wrote.

    If you are not sure what we mean by 'enhancements/features each person would be adding' mentioned above, see the panel below for our recommendation on how to divide the tP work:

    3 Set up the project repo

    1. [/ one member] Set up the team org:
      While only one member needs to do this, it may be useful to do this as a team while that member is screensharing, so that others get to see how it is done too.

    1. [/ one member] Set up the team repo (including the issue tracker):

    1. [ each member] Set up individual forks:

    4 Get familiar with the codebase

    FAQ Is this a team task or an individual task?


    Ideally, you should do this task in this week, but you may take an extra week (i.e., by week 7) to finish.

    • Do the following tutorials to get familiar with the codebase

    Tutorial 1 - Tracing a Command Execution Path

    See here for details.

    We recommend that you put in a sincere effort into this tutorial because tracing through the code of an unfamiliar codebase is an important skill that you can learn by doing so; you will not be able to learn/practice later in the project as the code will no longer be 'unfamiliar' to you later.

    Submission [optional]: Post an issue in your team's repo with the title Tutorial: tracing code. In the description, add a 2-3 screenshots you took while at various points of the tutorial. You may close the issue soon after.


    Tutorial 2 - Adding a new Command

    See here for details.

    If you are an experienced programmer, you can add a different command than the one given in the tutorial.

    Submission: Do your changes in a branch named tutorial-adding-command, push to your fork, and create a PR from your fork's tutorial-adding-command branch to your team repo's master branch. You may close the PR soon after.

    FAQ When doing this tP tutorial, do we have to write/update test cases too?



    Tutorial 3 - Removing a field from an entity

    See here for details.

    This tutorial is optional to do, but at least give it a quick read.

    Submission: not required.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week6/project.page-vue-render.js b/schedule/week6/project.page-vue-render.js index 653371165c..22f8085ac2 100644 --- a/schedule/week6/project.page-vue-render.js +++ b/schedule/week6/project.page-vue-render.js @@ -122,6 +122,6 @@ with(this){return _c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",att with(this){return _c('ul',[_c('li',[_v("Do the following tutorials to get familiar with the codebase")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week6/topics.html b/schedule/week6/topics.html index 3e1042fa3b..453e36bae5 100644 --- a/schedule/week6/topics.html +++ b/schedule/week6/topics.html @@ -156,7 +156,7 @@ -

    Resources:

    Tutorials:

    • A video tutorial by SimplyCoded:

    Best Practices:



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:

    Tutorials:

    • A video tutorial by SimplyCoded:

    Best Practices:



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week6/topics.page-vue-render.js b/schedule/week6/topics.page-vue-render.js index 66833949b4..490d50324a 100644 --- a/schedule/week6/topics.page-vue-render.js +++ b/schedule/week6/topics.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week6/tutorial.html b/schedule/week6/tutorial.html index aef26aaeb9..5a2de812d7 100644 --- a/schedule/week6/tutorial.html +++ b/schedule/week6/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 6 [Mon, Sep 16th] - Tutorial

    1 Demo your debugging skills

    This tutorial task prepares you for an upcoming tP task. So, do not skip it.

    Relevant textbook topic:

    If you are new to debugging with an IDE, we recommend you have a look at [guide@se-edu] Intellij IDEA: Using the debugger.

    1. Open your iP or tP code in your IDE.
    2. Set a breakpoint somewhere in the code.
    3. Run the code in debug mode.
    4. When the execution stops at the break point, use the debugger to execute 1-2 more statements.
    5. Take a screenshot of the IDE and paste in the tutorial workspace file.
    6. Optional: Set a , take a screenshot of it, and paste it in the same file.

    2 Sequence diagrams exercise

    • Do the following two exercises, as guided by the tutor.

    Explain Sequence Diagram about Machine


    Explain Sequence Diagram (ParserFactory)


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 6 [Mon, Sep 16th] - Tutorial

    1 Demo your debugging skills

    This tutorial task prepares you for an upcoming tP task. So, do not skip it.

    Relevant textbook topic:

    If you are new to debugging with an IDE, we recommend you have a look at [guide@se-edu] Intellij IDEA: Using the debugger.

    1. Open your iP or tP code in your IDE.
    2. Set a breakpoint somewhere in the code.
    3. Run the code in debug mode.
    4. When the execution stops at the break point, use the debugger to execute 1-2 more statements.
    5. Take a screenshot of the IDE and paste in the tutorial workspace file.
    6. Optional: Set a , take a screenshot of it, and paste it in the same file.

    2 Sequence diagrams exercise

    • Do the following two exercises, as guided by the tutor.

    Explain Sequence Diagram about Machine


    Explain Sequence Diagram (ParserFactory)


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week6/tutorial.page-vue-render.js b/schedule/week6/tutorial.page-vue-render.js index f1bc28dbd7..75a5046217 100644 --- a/schedule/week6/tutorial.page-vue-render.js +++ b/schedule/week6/tutorial.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('li',[_v("Take a screenshot of the IDE and paste in the "), with(this){return _c('ul',[_c('li',[_v("Do the following two exercises, as guided by the tutor.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week7/admin.html b/schedule/week7/admin.html index abadd255eb..a2e238f6f7 100644 --- a/schedule/week7/admin.html +++ b/schedule/week7/admin.html @@ -13,7 +13,7 @@ +weekly briefing).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week7/admin.page-vue-render.js b/schedule/week7/admin.page-vue-render.js index cfd0aec50a..c9f3f964de 100644 --- a/schedule/week7/admin.page-vue-render.js +++ b/schedule/week7/admin.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"week-7-mon-sep-30th-admin"}},[_v("Week 7 with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',[_v("Weekly quiz")]),_v(": Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline "),_c('span',{staticClass:"dimmed"},[_v("(i.e., before the following\nweekly briefing)")]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week7/index.html b/schedule/week7/index.html index 14812951ef..91208b1e98 100644 --- a/schedule/week7/index.html +++ b/schedule/week7/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 7 [Mon, Sep 30th] - Summary

    [MUST-WATCH] Course Briefing Segment - tP (Part 2)

    Noticed anything odd about the videos below?

    In these two videos, we used an AI-driven text-to-speech tool to create some parts of the narrations, as an experiment. See if you can spot which parts are AI-generated and which parts are not.

    tP Briefing (Part 2a -- v1.1, Workflow)

    Video 6 mins

    tP Briefing (Part 2b -- v1.2-v1.6, PE, Grading, Workload)

    Video 6 mins


    Topics:

    • [W7.1] Requirements: Use Cases

    • [W7.2] Design: High-Level View

    • [W7.3] Design: Fundamentals

    • [W7.4] IDEs: Advanced Features : OPTIONAL

    • [W7.5] Integration Approaches

    • [W7.6] Project Mgt: Scheduling and Tracking

    • [W7.7] Project Mgt: Workflows

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. [Optional] Get more out of the iP

    tP: v1.1

    1. Do a 'workflow practice' session Thu, Oct 3rd 23:59
    2. Update the project website
    3. Update the DG: user stories, glossary, NFRs, use cases
    4. Start the next iteration

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 7 [Mon, Sep 30th] - Summary

    [MUST-WATCH] Course Briefing Segment - tP (Part 2)

    Noticed anything odd about the videos below?

    In these two videos, we used an AI-driven text-to-speech tool to create some parts of the narrations, as an experiment. See if you can spot which parts are AI-generated and which parts are not.

    tP Briefing (Part 2a -- v1.1, Workflow)

    Video 6 mins

    tP Briefing (Part 2b -- v1.2-v1.6, PE, Grading, Workload)

    Video 6 mins


    Topics:

    • [W7.1] Requirements: Use Cases

    • [W7.2] Design: High-Level View

    • [W7.3] Design: Fundamentals

    • [W7.4] IDEs: Advanced Features : OPTIONAL

    • [W7.5] Integration Approaches

    • [W7.6] Project Mgt: Scheduling and Tracking

    • [W7.7] Project Mgt: Workflows

    Full ToC


    Admin:

    1. Submit weekly quiz

    iP:

    1. [Optional] Get more out of the iP

    tP: v1.1

    1. Do a 'workflow practice' session Thu, Oct 3rd 23:59
    2. Update the project website
    3. Update the DG: user stories, glossary, NFRs, use cases
    4. Start the next iteration

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week7/index.page-vue-render.js b/schedule/week7/index.page-vue-render.js index ef6eb454f4..2cb7251771 100644 --- a/schedule/week7/index.page-vue-render.js +++ b/schedule/week7/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Admin:")])])} with(this){return _c('div',[_c('p',[_c('strong',[_v("iP:")])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_v("[Optional] Get more out of the iP")])])])]),_v(" "),_c('p',[_c('strong',[_v("tP:")]),_v(" "),_c('span',{staticClass:"border rounded text-success border-success pe-1 ps-1"},[_c('span',{staticClass:"fas fa-tag",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("v1.1")])])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Do a 'workflow practice' session")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Thu, Oct 3rd 23:59")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Update the project website")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Update the DG: user stories, glossary, NFRs, use cases")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Start the next iteration")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week7/project.html b/schedule/week7/project.html index f0bf83c04f..23e9a97341 100644 --- a/schedule/week7/project.html +++ b/schedule/week7/project.html @@ -25,7 +25,7 @@ Note that the image of the UI should be docs/images/Ui.png so that it can be downloaded by our scripts. Limit the file to contain one screenshot/mockup only and ensure the new image is roughly the same height x width proportions as the original one. Reason: when we compile these images from all teams into one page (example), yours should not look out of place.
    The UI mock up can be a hand-drawn sketch or created using a tool such as PowerPoint, PlantUML, Figma, etc. Don't spend a lot of time on this, as this will eventually be replaced by a screenshot of the actual product.
    Can we use an AB3 screenshot for this? Only in the unlikely case that your final product UI is expected to look exactly the same as AB3.
  • Update the link of the GitHub Actions build status badge (Build Status) so that it reflects the build status of your team repo.
  • Acknowledge the original source of the code e.g.,
    This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
  • Update all remaining contents of the page to match your own project.
  • If you did the above updates correctly, your UI mock up and profile photos should appear in your project website and this Project List Page.

    B: Also update site-wide settings, as necessary:

    • You need to update the AB-3 in the top navigation bar of your project website (it's in docs\_config.yml and docs/_sass/minima/_base.scss if using Jekyll; in docs\_markbind\layouts\default.md if using MarkBind).

    • More info on updating site-wide settings such as the above:

    3 Update the DG: user stories, glossary, NFRs, use cases

    • Add the following to the DG, based on your project notes from the previous weeks. No need to update other sections, for now.
      Some examples of these can be found in the AB3 Developer Guide.

      • Target user profile, value proposition, and user stories: Update the target user profile and value proposition to match the project direction you have selected. Give a list of the user stories (and update/delete existing ones, if applicable), including priorities. This can include user stories considered but will not be included in the final product.
      • Use cases: Give a few representative use cases (textual form) that need multiple steps to complete. e.g. Adding a tag to a person (assume the user needs to find the person first)
      • Non-functional requirements: Note: Many of the given project constraints can be considered NFRs. You can add more. e.g. performance requirements, usability requirements, scalability requirements, etc.
      • Glossary: Define terms that are worth recording.

    The above DG sections should cover the full requirements of the product, some of which might not even get implemented by the end of this semester i.e., do not limit to just the requirements you intend to implement in the next iteration. Reason: All identified requirements need to be documented for future reference.

    Furthermore, these sections will be graded at the final project evaluation, and any bugs in the content can cost you marks at that point. The panel below gives some relevant DG bug examples you can lookout for:

    4 Start the next iteration

    • Stronger teams are welcome to stay one week ahead of the tP schedule. -So, feel free to move on to next week's tp tasks, and get started on the next iteration (i.e., v1.2).

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +So, feel free to move on to next week's tp tasks, and get started on the next iteration (i.e., v1.2).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week7/project.page-vue-render.js b/schedule/week7/project.page-vue-render.js index 67e21e20cb..b4c10fcbb9 100644 --- a/schedule/week7/project.page-vue-render.js +++ b/schedule/week7/project.page-vue-render.js @@ -140,6 +140,6 @@ with(this){return _c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",at with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',{staticClass:"text-success"},[_v("Stronger teams are welcome to stay one week ahead of the tP schedule.")]),_v("\nSo, feel free to move on to next week's tp tasks, and get started on the next iteration (i.e., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.2")]),_v(").")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week7/topics.html b/schedule/week7/topics.html index afd67d8624..5260b35225 100644 --- a/schedule/week7/topics.html +++ b/schedule/week7/topics.html @@ -243,7 +243,7 @@ (1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo.
    If there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new master branch to each of them.
    (2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.
  • Some alternatives mechanisms to achieve the same can be found in this GitHub help page.
    -If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.
  • Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.


    W7.7c

    Project Management → Revision Control → DRCS vs CRCS

    Can explain DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach


    W7.7d : OPTIONAL

    Project Management → Revision Control → Feature branch flow


    W7.7e : OPTIONAL

    Project Management → Revision Control → Centralized flow



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.

    Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.


    W7.7c

    Project Management → Revision Control → DRCS vs CRCS

    Can explain DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach


    W7.7d : OPTIONAL

    Project Management → Revision Control → Feature branch flow


    W7.7e : OPTIONAL

    Project Management → Revision Control → Centralized flow



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week7/topics.page-vue-render.js b/schedule/week7/topics.page-vue-render.js index 8eba7db46a..5e0b8cad6f 100644 --- a/schedule/week7/topics.page-vue-render.js +++ b/schedule/week7/topics.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week7/tutorial.html b/schedule/week7/tutorial.html index d4e98862c7..eceb7bf426 100644 --- a/schedule/week7/tutorial.html +++ b/schedule/week7/tutorial.html @@ -20,7 +20,7 @@

    Admin tP Grading → DG Bugs → Glossary → Possible Bugs

    Problems in Glossary. Examples:

    • Unnecessary terms included
    • Important terms missing

    Admin tP Grading → DG Bugs → Use Case → Possible Bugs

    Problems in Use Cases. Examples:

    • Important use cases missing (a use case is important if it involves a user interaction that is worthy of documenting e.g., it has multiple extensions -- this is not the same as the feature being important)
    • Formatting/notational errors
    • Incorrect step numbering
    • Unnecessary UI details mentioned
    • Missing/unnecessary steps
    • Missing extensions

    2 Refine your DG after the tutorial

    • After the tutorial, if applicable, refine the relevant sections of your own DG based on what you learned from the tutorial activities.
      -Note: Ideally, you should have completed iteration v1.1 already. In that case, this DG refinement can be done as part of a subsequent iteration (e.g., v1.2)
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Note: Ideally, you should have completed iteration v1.1 already. In that case, this DG refinement can be done as part of a subsequent iteration (e.g., v1.2)
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week7/tutorial.page-vue-render.js b/schedule/week7/tutorial.page-vue-render.js index d75aa106ca..42a3510816 100644 --- a/schedule/week7/tutorial.page-vue-render.js +++ b/schedule/week7/tutorial.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('ul',[_c('li',[_v("After the tutorial, if applicable, refine the relevant sections of your own DG based on what you learned from the tutorial activities."),_c('br'),_v("\nNote: Ideally, you should have completed iteration "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.1")]),_v(" already. In that case, this DG refinement can be done as part of a subsequent iteration (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.2")]),_v(")")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week8/admin.html b/schedule/week8/admin.html index e364e027f8..6feedae584 100644 --- a/schedule/week8/admin.html +++ b/schedule/week8/admin.html @@ -16,7 +16,7 @@ weekly briefing).

    2 Submit midterm peer evaluations on TEAMMATES Sun, Oct 13th 2359

    • Midterm Peer Evaluation will open on TEAMMATES. You will receive the submission link by Sat, Oct 5th 10:00.
      If you did not receive the submission link, you can get TEAMMATES to resend the link by going to TEAMMATES link recovery page and entering your NUSNET email address (try the e______@u.nus.edu before trying the 'friendly' email address). Remember to check your spam folder as well.

    Admin Peer Evaluations → Session: Midterm Peer Evaluation

    Session: Midterm Peer Evaluation

    • Held about two weeks into the tP coding phase
    Important questions included in the evaluation:

    Some of these questions (e.g., contribution to DG) are omitted from the midterm peer evaluation but are in the final peer evaluation (they are given here for your reference)

    Q The team members' contribution to the User Guide is,

    Uses the Equal Share +/- N% scale for the answer


    Q The team members' contribution to the Developer Guide is,

    Uses the Equal Share +/- N% scale for the answer


    Q The team members' contribution to the team-based tasks is,

    Uses the Equal Share +/- N% scale for the answer


    Q The team members' contribution to the product implementation (excluding UG, DG, and team-based tasks) is,

    Uses the Equal Share +/- N% scale for the answer


    Q The team members' conduct in the project and during tutorials,

    • Evaluated based on the following criteria, on a scale Poor/Below Average/Average/Good/Excellent:

    Peer Evaluation Criteria: Professional Conduct

    • Professional Communication :
      • Communicates sufficiently and professionally. e.g. Does not use offensive language or excessive slang in project communications.
      • Responds to communication from team members in a timely manner (e.g. within 24 hours).
    • Punctuality: Does not cause others to waste time or slow down project progress by frequent tardiness.
    • Dependability: Promises what can be done, and delivers what was promised.
    • Effort: Puts in sufficient effort to, and tries their best to keep up with the course/project pace. Seeks help from others when necessary.
    • Quality: Does not deliver work products that seem to be below the student's competence level i.e. tries their best to make the work product as high quality as possible within her competency level.
    • Meticulousness: -
      • Rarely overlooks submission requirements.
      • Rarely misses compulsory course activities such as pre-course survey.
    • Teamwork: How willing are you to act as part of a team, contribute to team-level tasks, adhere to team decisions, etc. Honors all collectively agreed-upon commitments e.g., weekly project meetings.

    Q The competency of the team member demonstrated in the project and during the tutorials,

    • Considered only for bonus marks, A+ grades, and tutor recruitment
    • Evaluated based on the following criteria, on a scale Poor/Below Average/Average/Good/Excellent:

    Peer Evaluation Criteria: Competency

    • Technical Competency: Able to gain competency in all the required tools and techniques.
    • Mentoring skills: Helps others when possible. Able to mentor others well.
    • Communication skills: Able to communicate (written and spoken) well. Takes initiative in discussions.

    Q [Optional] Any ANONYMOUS feedback you want to give the classmates you reviewed above?

    Q [Optional] Any CONFIDENTIAL comments about any team members?


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Rarely overlooks submission requirements.
    • Rarely misses compulsory course activities such as pre-course survey.
  • Teamwork: How willing are you to act as part of a team, contribute to team-level tasks, adhere to team decisions, etc. Honors all collectively agreed-upon commitments e.g., weekly project meetings.
  • Q The competency of the team member demonstrated in the project and during the tutorials,

    • Considered only for bonus marks, A+ grades, and tutor recruitment
    • Evaluated based on the following criteria, on a scale Poor/Below Average/Average/Good/Excellent:

    Peer Evaluation Criteria: Competency

    • Technical Competency: Able to gain competency in all the required tools and techniques.
    • Mentoring skills: Helps others when possible. Able to mentor others well.
    • Communication skills: Able to communicate (written and spoken) well. Takes initiative in discussions.

    Q [Optional] Any ANONYMOUS feedback you want to give the classmates you reviewed above?

    Q [Optional] Any CONFIDENTIAL comments about any team members?


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week8/admin.page-vue-render.js b/schedule/week8/admin.page-vue-render.js index 548dd59feb..6def21c8a9 100644 --- a/schedule/week8/admin.page-vue-render.js +++ b/schedule/week8/admin.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('span',{staticClass:"badge bg-secondary font-weight-normal with(this){return _c('ul',[_c('li',[_c('strong',[_v("Midterm Peer Evaluation")]),_v(" will open on TEAMMATES. You will receive the submission link by Sat, Oct 5th 10:00."),_c('br'),_c('span',[_c('span',{staticClass:"badge rounded-pill bg-success text-white"},[_c('span',{staticClass:"fas fa-lightbulb",attrs:{"aria-hidden":"true"}})]),_v(" If you did not receive the submission link, you can get TEAMMATES to resend the link by going to "),_c('a',{attrs:{"href":"https://teammatesv4.appspot.com/web/front/help/session-links-recovery"}},[_v("TEAMMATES link recovery page")]),_v("\nand entering your NUSNET email address (try the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("e______@u.nus.edu")]),_v(" before trying the 'friendly' email address). Remember to check your spam folder as well.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week8/index.html b/schedule/week8/index.html index 557ca6bdaf..6d7115a847 100644 --- a/schedule/week8/index.html +++ b/schedule/week8/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 8 [Mon, Oct 7th] - Summary

    You are encouraged to try this week's tutorial questions before the actual tutorial. Otherwise, we might not have enough time to finish all the questions during the tutorial hour.

    Topics:

    • [W8.1] [Revisiting] Drawing Class/Object Diagrams - Basics

    • [W8.2] [Revisiting] Drawing Class/Object Diagrams - Intermediate

    • [W8.3] [Revisiting] Drawing Sequence Diagrams

    • [W8.4] Testing: Types

    • [W8.5] Testing: Intermediate Concepts

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Submit midterm peer evaluations on TEAMMATES Sun, Oct 13th 2359

    iP:

    1. Evaluate two peer iPs Sat, Oct 12th 2359

    tP: v1.2

    1. Divide MVP features among members
    2. / [Optional] Rename packages/classes
    3. Add the first functionality increment Thu, Oct 10th 23:59

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 8 [Mon, Oct 7th] - Summary

    You are encouraged to try this week's tutorial questions before the actual tutorial. Otherwise, we might not have enough time to finish all the questions during the tutorial hour.

    Topics:

    • [W8.1] [Revisiting] Drawing Class/Object Diagrams - Basics

    • [W8.2] [Revisiting] Drawing Class/Object Diagrams - Intermediate

    • [W8.3] [Revisiting] Drawing Sequence Diagrams

    • [W8.4] Testing: Types

    • [W8.5] Testing: Intermediate Concepts

    Full ToC


    Admin:

    1. Submit weekly quiz
    2. Submit midterm peer evaluations on TEAMMATES Sun, Oct 13th 2359

    iP:

    1. Evaluate two peer iPs Sat, Oct 12th 2359

    tP: v1.2

    1. Divide MVP features among members
    2. / [Optional] Rename packages/classes
    3. Add the first functionality increment Thu, Oct 10th 23:59

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week8/index.page-vue-render.js b/schedule/week8/index.page-vue-render.js index f9be77349a..e2ea845b76 100644 --- a/schedule/week8/index.page-vue-render.js +++ b/schedule/week8/index.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_c('strong',[_v("tP:")]),_v(" "),_c('span',{staticClas with(this){return _c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Divide MVP features among members")])]),_v(" "),_c('li',[_c('span',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}}),_v("/"),_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}}),_c('span',{staticClass:"dimmed"})]),_v(" [Optional] Rename packages/classes")])])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-user",attrs:{"aria-hidden":"true"}})]),_v(" Add the first functionality increment")]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Thu, Oct 10th 23:59")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week8/project.html b/schedule/week8/project.html index ebfbf24c9a..93a8b85478 100644 --- a/schedule/week8/project.html +++ b/schedule/week8/project.html @@ -32,7 +32,7 @@ This code change should not 'break' the code base though (e.g., it should not refer to a class that you plan to add in a future PR but doesn't exist yet). Ideally, it should not cause any existing tests to break either. That is, the change should take the codebase forward in a meaningful way.
  • Implement that code change while following the workflow that you practiced in the previous week. A summary of the steps:
    • Create an issue for it. Assign it to yourself. Assign it to milestone v1.2.
    • Create a PR from a separate branch in your fork. Assign it to v1.2.
    • Get the PR reviewed.
    • Get the PR merged. Close the corresponding issue.
  • Continue to implement more code changes (i.e., repeat S1 and S2) to implement more code changes that move you towards your MVP feature(s). Recommended to create , when implementing code changes with no/low dependency between them.
  • Wrap up the milestone When the iteration period is over, do the following:
    • Move any pending issues/PRs to the next milestone (i.e., v1.3). As we did not plan to release a product version at the end of this iteration, we can freely move any pending work to the next iteration.
    • Close the milestone.
    • There is no need to do a product release.
  • FAQ How much code changes is 'enough' for this iteration?


    FAQ What if we overshoot the deadline for a tP iteration?


    FAQ Do we have to update tests when we update functional code?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Can we PR against a branch other than master, and merge that branch to master in a later iteration?


    FAQ Do we need to update user/developer guides to match code changes?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    End of tP Week 8

    Shocked by iP to tP transition? Around this time you will realize how the speed you can implement things in the tP is significantly slower compared to the iP. As discouraging as this might feel, there are several ways this can contribute towards the learning outcomes of this course, and it is not expected to affect your tP grade either.

    More on this ...


    Feel free to improve AB3 in any way you see fit. While not very 'buggy', AB3 is not 'perfect' either (it is not meant to be a 'model solution'). In particular, find and fix any bugs it has. If you are not sure if something is a bug or an intended behavior, you can post in the forum to check.
    -While we are on the topic, also note that the architecture of AB3 doesn't suit every kind of application either. As you gain more experience in other application domains, you will learn different types of architectures that you can add to the collection of different architectures that you can consider for future projects. The same goes for the tool chain and the tech stack of AB3. Therefore, do not try to apply AB3 as a template for every other project you encounter in the future.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +While we are on the topic, also note that the architecture of AB3 doesn't suit every kind of application either. As you gain more experience in other application domains, you will learn different types of architectures that you can add to the collection of different architectures that you can consider for future projects. The same goes for the tool chain and the tech stack of AB3. Therefore, do not try to apply AB3 as a template for every other project you encounter in the future.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week8/project.page-vue-render.js b/schedule/week8/project.page-vue-render.js index 9a1f2bac47..25efd96937 100644 --- a/schedule/week8/project.page-vue-render.js +++ b/schedule/week8/project.page-vue-render.js @@ -122,6 +122,6 @@ with(this){return _c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticCla with(this){return _c('h4',{attrs:{"id":"end-of-tp-week-8"}},[_c('strong',[_c('strong',[_v("End of tP Week 8")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#end-of-tp-week-8","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week8/topics.html b/schedule/week8/topics.html index c773bec730..f1b554e042 100644 --- a/schedule/week8/topics.html +++ b/schedule/week8/topics.html @@ -270,7 +270,7 @@

    The number of paths through this method is very large, as each possible length of names produces a unique path.

    1. enter -> 2 -> exit (if names is empty)
    2. enter -> 2 -> 3 -> exit (if names has one entry)
    3. enter -> 2 -> 3 -> 2 -> 3 -> exit (if names has two entries) -1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    Exercises:

    Highest intensity coverage



    W8.5e

    Quality Assurance → Testing → Test Coverage → How

    Can explain how test coverage works

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)



    TDD

    Video

    W8.5f

    Quality Assurance → Testing → Test-Driven Development → What

    Can explain TDD

    Test-Driven Development(TDD) advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments. In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.


    Exercises:

    When do we write tests in TDD?



    W8.5g : OPTIONAL

    Quality Assurance → Testing → Test-Driven Development → How


    Follow up notes for the item(s) above:

    You are welcome to, but not required to, follow the TDD approach in your project.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    Exercises:

    Highest intensity coverage



    W8.5e

    Quality Assurance → Testing → Test Coverage → How

    Can explain how test coverage works

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)



    TDD

    Video

    W8.5f

    Quality Assurance → Testing → Test-Driven Development → What

    Can explain TDD

    Test-Driven Development(TDD) advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments. In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.


    Exercises:

    When do we write tests in TDD?



    W8.5g : OPTIONAL

    Quality Assurance → Testing → Test-Driven Development → How


    Follow up notes for the item(s) above:

    You are welcome to, but not required to, follow the TDD approach in your project.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week8/topics.page-vue-render.js b/schedule/week8/topics.page-vue-render.js index 05bd7daa71..ce52773217 100644 --- a/schedule/week8/topics.page-vue-render.js +++ b/schedule/week8/topics.page-vue-render.js @@ -50,6 +50,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week8/tutorial.html b/schedule/week8/tutorial.html index 8fd3f0308d..2d3ab03bc3 100644 --- a/schedule/week8/tutorial.html +++ b/schedule/week8/tutorial.html @@ -57,7 +57,7 @@ -
    1. during the tutorial:
    • As before, paste the diagram in the tutorial workspace document, and take part in the follow-up discussion, as guided by the tutor.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    1. during the tutorial:
    • As before, paste the diagram in the tutorial workspace document, and take part in the follow-up discussion, as guided by the tutor.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week8/tutorial.page-vue-render.js b/schedule/week8/tutorial.page-vue-render.js index 48fb04265b..bf13bb16dd 100644 --- a/schedule/week8/tutorial.page-vue-render.js +++ b/schedule/week8/tutorial.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('ol',{attrs:{"start":"2"}},[_c('li',[_c('span',{staticClass with(this){return _c('div',{staticClass:"indented"},[_c('ul',[_c('li',[_v("As before, paste the diagram in the "),_c('em',[_v("tutorial workspace")]),_v(" document, and take part in the follow-up discussion, as guided by the tutor.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week9/admin.html b/schedule/week9/admin.html index 06d086d29e..c5709c6cfc 100644 --- a/schedule/week9/admin.html +++ b/schedule/week9/admin.html @@ -13,7 +13,7 @@ +weekly briefing).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week9/admin.page-vue-render.js b/schedule/week9/admin.page-vue-render.js index d00e2c880e..aa6bd34ecd 100644 --- a/schedule/week9/admin.page-vue-render.js +++ b/schedule/week9/admin.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{attrs:{"id":"week-9-mon-oct-14th-admin"}},[_v("Week 9 with(this){return _c('div',[_c('ul',[_c('li',[_c('strong',[_v("Weekly quiz")]),_v(": Read weekly topics allocated for this week and submit the weekly quiz before the quiz deadline "),_c('span',{staticClass:"dimmed"},[_v("(i.e., before the following\nweekly briefing)")]),_v(".")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week9/index.html b/schedule/week9/index.html index cb8435fec7..373c7e4330 100644 --- a/schedule/week9/index.html +++ b/schedule/week9/index.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 9 [Mon, Oct 14th] - Summary

    Similar to the previous week, you are encouraged to try this week's tutorial questions before the actual tutorial. Otherwise we might not have enough time to finish all the questions during the tutorial hour.

    Topics:

    • [W9.1] Conceptual Class Diagrams (aka OODMs)

    • [W9.2] Activity Diagrams

    • [W9.3] Conceptualizing a Design

    • [W9.4] Architecture Diagrams: Drawing

    • [W9.5] Design Principles

    • [W9.6] [Revisiting] SDLC Process Models

    • [W9.7] SDLC Process Models (continued)

    • [W9.8] Writing Developer Documents

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.3

    1. Plan the first product release (v1.3)
    2. Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 9 [Mon, Oct 14th] - Summary

    Similar to the previous week, you are encouraged to try this week's tutorial questions before the actual tutorial. Otherwise we might not have enough time to finish all the questions during the tutorial hour.

    Topics:

    • [W9.1] Conceptual Class Diagrams (aka OODMs)

    • [W9.2] Activity Diagrams

    • [W9.3] Conceptualizing a Design

    • [W9.4] Architecture Diagrams: Drawing

    • [W9.5] Design Principles

    • [W9.6] [Revisiting] SDLC Process Models

    • [W9.7] SDLC Process Models (continued)

    • [W9.8] Writing Developer Documents

    Full ToC


    Admin:

    1. Submit weekly quiz

    tP: v1.3

    1. Plan the first product release (v1.3)
    2. Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week9/index.page-vue-render.js b/schedule/week9/index.page-vue-render.js index 0648185d23..9efb720d97 100644 --- a/schedule/week9/index.page-vue-render.js +++ b/schedule/week9/index.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('p',[_c('strong',[_v("Admin:")])])} with(this){return _c('div',[_c('p',[_c('strong',[_v("tP:")]),_v(" "),_c('span',{staticClass:"border rounded text-success border-success pe-1 ps-1"},[_c('span',{staticClass:"fas fa-tag",attrs:{"aria-hidden":"true"}}),_v(" "),_c('strong',[_v("v1.3")])])]),_v(" "),_c('div',[_c('ol',[_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Plan the first product release ("),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.3")]),_v(")")])]),_v(" "),_c('li',[_c('span',[_c('span',[_c('span',{staticClass:"fas fa-users",attrs:{"aria-hidden":"true"}})]),_v(" Manage the iteration, and deliver "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("v1.3")])]),_v(" "),_c('span',{staticClass:"badge bg-danger font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" Thu, Oct 17th 23:59")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week9/project.html b/schedule/week9/project.html index b45714223d..b3e81002d0 100644 --- a/schedule/week9/project.html +++ b/schedule/week9/project.html @@ -15,7 +15,7 @@

    Week 9 [Mon, Oct 14th] - Project

    tP: v1.3

    1. Plan the first product release (v1.3)
    2. Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    tP: MVP → v1.3

    Intro to tP Week 9

    What's happening this week:

    This week, we deliver the first working version of the product (i.e., the MVP), thus finishing what we started in the previous iteration.

    v1.3 (MVP)

    • Learning outcome: Able to deliver a fully working product, on time.
    • Product goal: Reach the .
    • Strategy: Decide on a plan to meet the MVP delivery deadline. Reduce risk by aiming for the smallest subset of must-have features.

    As per the learning outcome of this iteration (given above), our focus is on delivering a product on time. So, in task 1, we start by setting up a plan to reach that goal, and then execute on it in task 2 , while making course corrections as we go (if needed).

    Things to note:

    Iteration vs milestone vs version:

    An iteration can aim to reach zero or more milestones, some of which can be the release of a product version. So, they are three different things.
    For convenience, the tP uses a version number to refer to all three. For example, when we say iteration v1.3, we mean the iteration that ends in the milestone v1.3 (that also happens to deliver the product version v1.3).

    How to define version numbers?

    While there is no universal set of rules on choosing version numbers for a product, there is a convention named SemVer that is well-defined and widely used. Our tP version numbers (v1.3, v1.5, v1.6 etc.) do not follow SemVer strictly though.

    This is your first 'proper' iteration that delivers a product. Ensure you remember how you are expected to 'manage' an iteration (graded), given in the panel below:

    1 Plan the first product release (v1.3)

    Note that the product you deliver at the end of this iteration must be working although the functionality is basic.

    • Revise the iteration target, if necessary e.g., if v1.2 iteration felt like your progress is much slower than you anticipated, you can explore if MVP can be trimmed-down even further, to increase your chances of reaching it in time.
    • Enumerate the plan: decide tasks, order, timeline.
      1. Figure out what tasks needs to be done to reach v1.3 product version.
      2. Decide if there is a certain order in which they need to be done (based on dependencies between them)
      3. Decide the timeline on which you need to finish each.
    • Document the plan: create issues, assign milestone, and members.
      1. Create issues to match the tasks you enumerated above.
        In the issue description, you can mention when a task needs to be done (e.g., due: Monday). Alternatively, you can create a bunch of labels for recording due dates (e.g., due:Monday)
      2. Assign them to the milestone v1.3.
      3. Assign each of those issues to the person responsible for doing it.

    2 Manage the iteration, and deliver v1.3 Thu, Oct 17th 23:59

    Ways to level up your tP game:

    • Consider updating the UG as you go. As you implement a feature/enhancement, consider updating the user guide (UG) to match the new behavior.
    • Start reviewing each other's PRs seriously, and giving thoughtful review comments (i.e., as opposed to approving after a superficial look), if you haven't done so already.

    • Manage the iteration v1.3, and reach the milestone v1.3 (which delivers product version v1.3)
    • Aim to delivery on time, as that is linked to our tP learning outcome of this iteration. This means you need to monitor progress, and course-correct as you go.
      • Revise the MVP design further, if needed. If you think some of the ongoing work intended for the current iteration may not finish in time, you can reassign them to a future iteration, provided they are not essential for the v1.3 (i.e., you can still get a 'working product' without them).
      • or issues/PR accordingly.
    • Do a release on GitHub, when the product v1.3 is ready. Requirements: -
      • Write a fairly detailed Release Note in the text field GitHub provides for the description of the release. In particular, describe what has been changed (compared to AB3). This is just an itemized list of What's New -- no need to be as elaborate as a user guide.
        Include screenshots (or screen recordings) of your product in action, featuring the changes you've done.
        These release notes will be checked by the teaching team to verify (a) that they are written reasonably well, and, (b) that the features mentioned in there show the product has reached the MVP level of functionality.
      • Upload the JAR file as well. Instructions for creating a JAR file can be found in as described in the tP Developer Guide.
    • Wrap up the milestone on GitHub, when you are done with this iteration and the MVP has been released.

    FAQ Should we try to automate GUI testing as well?


    FAQ All tests pass locally, but the same code fails CI in the PR. How come?


    FAQ PR passed CI before merging, but fails CI after merging. How come?


    Some other relevant FAQs, repeated from last week:

    FAQ Do we have to update tests when we update functional code?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Can we PR against a branch other than master, and merge that branch to master in a later iteration?


    FAQ Do we need to update user/developer guides to match code changes?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    End of tP Week 9

    Phew! Hope your first product release went well, and was on time. If it didn't, not to worry; we have more tries to get it right.

    For now, give some thoughts to the following questions (the answer will be needed for an activity in the next iteration):

    • Were you able to deliver on time? If not, why?
    • How do initial effort estimations compare to actual effort? Took more or less effort than anticipated?
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • Write a fairly detailed Release Note in the text field GitHub provides for the description of the release. In particular, describe what has been changed (compared to AB3). This is just an itemized list of What's New -- no need to be as elaborate as a user guide.
      Include screenshots (or screen recordings) of your product in action, featuring the changes you've done.
      These release notes will be checked by the teaching team to verify (a) that they are written reasonably well, and, (b) that the features mentioned in there show the product has reached the MVP level of functionality.
    • Upload the JAR file as well. Instructions for creating a JAR file can be found in as described in the tP Developer Guide.
  • Wrap up the milestone on GitHub, when you are done with this iteration and the MVP has been released.
  • FAQ Should we try to automate GUI testing as well?


    FAQ All tests pass locally, but the same code fails CI in the PR. How come?


    FAQ PR passed CI before merging, but fails CI after merging. How come?


    Some other relevant FAQs, repeated from last week:

    FAQ Do we have to update tests when we update functional code?


    FAQ PR CI fails because Codecov reports a drop in code coverage. What to do?


    FAQ Can we PR against a branch other than master, and merge that branch to master in a later iteration?


    FAQ Do we need to update user/developer guides to match code changes?


    FAQ Are we allowed to deviate from the MVP Feature Specification submitted earlier?


    End of tP Week 9

    Phew! Hope your first product release went well, and was on time. If it didn't, not to worry; we have more tries to get it right.

    For now, give some thoughts to the following questions (the answer will be needed for an activity in the next iteration):

    • Were you able to deliver on time? If not, why?
    • How do initial effort estimations compare to actual effort? Took more or less effort than anticipated?
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week9/project.page-vue-render.js b/schedule/week9/project.page-vue-render.js index 26ee07b764..37db214944 100644 --- a/schedule/week9/project.page-vue-render.js +++ b/schedule/week9/project.page-vue-render.js @@ -71,6 +71,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_v("Some other relev with(this){return _c('div',[_c('div',{staticClass:"border border-success pt-2 ps-2 pe-1 border-top-0 rounded-bottom",staticStyle:{"background-color":"#e6fff2"}},[_c('h4',{attrs:{"id":"end-of-tp-week-9"}},[_c('strong',[_c('strong',[_v("End of tP Week 9")])]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#end-of-tp-week-9","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Phew! Hope your first product release went well, and was on time. If it didn't, not to worry; we have more tries to get it right.")]),_v(" "),_c('p',[_v("For now, give some thoughts to the following questions (the answer will be needed for an activity in the next iteration):")]),_v(" "),_c('ul',[_c('li',[_v("Were you able to deliver on time? If not, why?")]),_v(" "),_c('li',[_v("How do initial effort estimations compare to actual effort? Took more or less effort than anticipated?")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week9/topics.html b/schedule/week9/topics.html index 394a537b6d..c8e914fa07 100644 --- a/schedule/week9/topics.html +++ b/schedule/week9/topics.html @@ -110,7 +110,7 @@ And this is how FrontEnd and BackEnd work together ...

    [Now you can drill down to FrontEnd's details.]

    FrontEnd consists of three major components: A, B, C

    A's job is to ...
    B's job is to...
    C's job is to...

    And this is how the three components work together ...

    [At this point, further drill down to the internal workings of each component. A reader who is not interested in knowing the nitty-gritty details can skip ahead to the section on BackEnd.]

    In-depth description of A

    In-depth description of B

    -...

    [At this point drill down to the details of the BackEnd.]

    ...



    Guideline: Minimal but Sufficient

    W9.8g

    Implementation → Documentation → Guidelines → Minimal but Sufficient → What

    Can explain that documentation should be minimal yet sufficient

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.

    W9.8h

    Implementation → Documentation → Guidelines → Minimal but Sufficient → How

    Can write minimal yet sufficient documentation

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    [At this point drill down to the details of the BackEnd.]

    ...



    Guideline: Minimal but Sufficient

    W9.8g

    Implementation → Documentation → Guidelines → Minimal but Sufficient → What

    Can explain that documentation should be minimal yet sufficient

    Aim for 'just enough' developer documentation.

    • Writing and maintaining developer documents is an overhead. You should try to minimize that overhead.
    • If the readers are developers who will eventually read the code, the documentation should complement the code and should provide only just enough guidance to get started.

    W9.8h

    Implementation → Documentation → Guidelines → Minimal but Sufficient → How

    Can write minimal yet sufficient documentation

    Anything that is already clear in the code need not be described in words. Instead, focus on providing higher level information that is not readily visible in the code or comments.

    Refrain from duplicating chunks of text. When describing several similar algorithms/designs/APIs, etc., do not simply duplicate large chunks of text. Instead, describe the similarities in one place and emphasize only the differences in other places. It is very annoying to see pages and pages of similar text without any indication as to how they differ from each other.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week9/topics.page-vue-render.js b/schedule/week9/topics.page-vue-render.js index 4cadef2676..a10cdacd96 100644 --- a/schedule/week9/topics.page-vue-render.js +++ b/schedule/week9/topics.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('div',[_c('div',[_c('div',{staticClass:"border border-succe with(this){return _c('div',{staticClass:"indented"},[_c('div')])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/schedule/week9/tutorial.html b/schedule/week9/tutorial.html index c908de0204..bcfc60d1c2 100644 --- a/schedule/week9/tutorial.html +++ b/schedule/week9/tutorial.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Week 9 [Mon, Oct 14th] - Tutorial

    1 Demo measuring code coverage

    • Measure test coverage in your own IDE. Take a screenshot showing test coverage details such as lines covered, lines not covered, percentage of coverage for different files etc.

    • When prompted by the tutor, post the screenshot in the tutorial workspace document. An example is given below:

    2 Exercise: CCDs

    1. before the tutorial Do the following question. As before, you should freehand-draw the diagram.
      You can use the association class notation in the answer.

    CCD for the Course domain


    1. during the tutorial
      • Paste a screenshot/scan/photo of your answer in the online document.
      • Discuss a sample answer, as guided by the tutor.

    When discussing CCDs, remember to avoid terms such as design, implementation, variable, method as these are terms used in the solution domain whereas an CCD is about the problem domain.

    • Bad "we can design it this way"
      Good "we can model it this way"
    • Bad "coordinator variable contains Foo objects"
      Good "Foo objects are playing the role of coordinator"
    • Bad "the implementation will be like this"
      Good "this model can support this object structure"

    3 Exercise: Activity Diagrams

    1. before the tutorial Do the following question, similar to the previous question.

    Model workflow of a Burger shop


    1. during the tutorial Post your answer and discuss, similar to the previous question.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Week 9 [Mon, Oct 14th] - Tutorial

    1 Demo measuring code coverage

    • Measure test coverage in your own IDE. Take a screenshot showing test coverage details such as lines covered, lines not covered, percentage of coverage for different files etc.

    • When prompted by the tutor, post the screenshot in the tutorial workspace document. An example is given below:

    2 Exercise: CCDs

    1. before the tutorial Do the following question. As before, you should freehand-draw the diagram.
      You can use the association class notation in the answer.

    CCD for the Course domain


    1. during the tutorial
      • Paste a screenshot/scan/photo of your answer in the online document.
      • Discuss a sample answer, as guided by the tutor.

    When discussing CCDs, remember to avoid terms such as design, implementation, variable, method as these are terms used in the solution domain whereas an CCD is about the problem domain.

    • Bad "we can design it this way"
      Good "we can model it this way"
    • Bad "coordinator variable contains Foo objects"
      Good "Foo objects are playing the role of coordinator"
    • Bad "the implementation will be like this"
      Good "this model can support this object structure"

    3 Exercise: Activity Diagrams

    1. before the tutorial Do the following question, similar to the previous question.

    Model workflow of a Burger shop


    1. during the tutorial Post your answer and discuss, similar to the previous question.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/schedule/week9/tutorial.page-vue-render.js b/schedule/week9/tutorial.page-vue-render.js index c2e546ef24..0ae5cf523e 100644 --- a/schedule/week9/tutorial.page-vue-render.js +++ b/schedule/week9/tutorial.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('ol',[_c('li',[_c('span',{staticClass:"badge bg-danger fon with(this){return _c('ol',{attrs:{"start":"2"}},[_c('li',[_c('span',{staticClass:"badge bg-info font-weight-normal"},[_c('span',[_c('span',{staticClass:"far fa-clock",attrs:{"aria-hidden":"true"}}),_v(" during the tutorial")])]),_v(" Post your answer and discuss, similar to the previous question.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/architecture-printable.html b/se-book-adapted/chapters-printable/architecture-printable.html index f36b4ab1e5..13ce4acbe1 100644 --- a/se-book-adapted/chapters-printable/architecture-printable.html +++ b/se-book-adapted/chapters-printable/architecture-printable.html @@ -13,7 +13,7 @@

    Software architecture

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    The software architecture of a program or computing system is the structure or structures of the system, which comprise software elements, the externally visible properties of those elements, and the relationships among them. Architecture is concerned with the public side of interfaces; private details of elements—details having to do solely with internal implementation—are not architectural. --- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.

    Architecture diagrams

    Reading

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:

    Drawing

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.

    Architectural styles

    Introduction

    What

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...

    N-tier architectural style

    What

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.

    Client-server architectural style

    What

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.

    Transaction processing architectural style

    What

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.

    Service-oriented architectural style

    What

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.

    Event-driven architectural style

    What

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.

    More

    Using Styles

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +-- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.

    Architecture diagrams

    Reading

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:

    Drawing

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.

    Architectural styles

    Introduction

    What

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...

    N-tier architectural style

    What

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.

    Client-server architectural style

    What

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.

    Transaction processing architectural style

    What

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.

    Service-oriented architectural style

    What

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.

    Event-driven architectural style

    What

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.

    More

    Using Styles

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/architecture-printable.page-vue-render.js b/se-book-adapted/chapters-printable/architecture-printable.page-vue-render.js index 24065c878b..f9834f442e 100644 --- a/se-book-adapted/chapters-printable/architecture-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/architecture-printable.page-vue-render.js @@ -74,6 +74,6 @@ with(this){return _c('div',[_c('h3',{attrs:{"id":"more"}},[_c('span',[_v("More") with(this){return _c('p',[_c('strong',[_v("Most applications use a mix of these architectural styles.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/codeQuality-printable.html b/se-book-adapted/chapters-printable/codeQuality-printable.html index ddd02bc766..1ae56370f4 100644 --- a/se-book-adapted/chapters-printable/codeQuality-printable.html +++ b/se-book-adapted/chapters-printable/codeQuality-printable.html @@ -1755,7 +1755,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/codeQuality-printable.page-vue-render.js b/se-book-adapted/chapters-printable/codeQuality-printable.page-vue-render.js index a7bf188893..ec9bb10d74 100644 --- a/se-book-adapted/chapters-printable/codeQuality-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/codeQuality-printable.page-vue-render.js @@ -200,6 +200,6 @@ with(this){return _c('p',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[ with(this){return _c('p',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('span',{staticClass:"fas fa-times",attrs:{"aria-hidden":"true"}})])]),_v(" "),_c('strong',[_v("HOW: The explanation for how the code works.")]),_v(" This should already be apparent from the code, if the code is self-explanatory. Adding comments to explain the same thing is redundant.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/cppToJava-printable.html b/se-book-adapted/chapters-printable/cppToJava-printable.html index 4006c11b84..5713b189d9 100644 --- a/se-book-adapted/chapters-printable/cppToJava-printable.html +++ b/se-book-adapted/chapters-printable/cppToJava-printable.html @@ -7204,7 +7204,7 @@ -

    Resources:

    Streams :

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).

    JavaFX

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:

    Streams :

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).

    JavaFX

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/cppToJava-printable.page-vue-render.js b/se-book-adapted/chapters-printable/cppToJava-printable.page-vue-render.js index f5c292f7f9..366a833b19 100644 --- a/se-book-adapted/chapters-printable/cppToJava-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/cppToJava-printable.page-vue-render.js @@ -1193,6 +1193,6 @@ with(this){return _c('div',{staticClass:"indented-less"},[_c('h4',{attrs:{"id":" with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_v("JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by "),_c('a',{attrs:{"href":"https://wiki.openjdk.java.net/display/OpenJFX"}},[_v("OpenJDK")]),_v(".")]),_v(" "),_c('p',[_v("Refer to the "),_c('a',{attrs:{"href":"https://se-education.org/guides/tutorials/javaFx.html"}},[_c('em',[_v("JavaFX tutorial")]),_v(" @SE-EDU/guides")]),_v(" to learn how to get started with JavaFX.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/design-printable.html b/se-book-adapted/chapters-printable/design-printable.html index f551ed5c44..56c4ba46b5 100644 --- a/se-book-adapted/chapters-printable/design-printable.html +++ b/se-book-adapted/chapters-printable/design-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Software design

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Software design

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/design-printable.page-vue-render.js b/se-book-adapted/chapters-printable/design-printable.page-vue-render.js index f033ae98d3..1ca0a32c06 100644 --- a/se-book-adapted/chapters-printable/design-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/design-printable.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('p',[_c('strong',[_v("Software design has two main aspects: with(this){return _c('ul',[_c('li',[_c('strong',[_v("Product/external design: designing the external behavior of the product to meet the users' requirements.")]),_v(" This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.")]),_v(" "),_c('li',[_c('strong',[_v("Implementation/internal design: designing how the product will be implemented to meet the required external behavior.")]),_v(" This is usually done by software architects and software engineers.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/designApproaches-printable.html b/se-book-adapted/chapters-printable/designApproaches-printable.html index ed61bf3b75..c350ba9646 100644 --- a/se-book-adapted/chapters-printable/designApproaches-printable.html +++ b/se-book-adapted/chapters-printable/designApproaches-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Design approaches

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Multi-level design

    What

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:




    Top-down and bottom-up design

    What

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Agile design

    What

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design approaches

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Multi-level design

    What

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:




    Top-down and bottom-up design

    What

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Agile design

    What

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/designApproaches-printable.page-vue-render.js b/se-book-adapted/chapters-printable/designApproaches-printable.page-vue-render.js index c997370f82..23db7a995c 100644 --- a/se-book-adapted/chapters-printable/designApproaches-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/designApproaches-printable.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"agile-design"}},[_c('span',[_v with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Agile design")]),_v(" can be contrasted with "),_c('em',[_v("full upfront design")]),_v(" in the following way")]),_v(":")]),_v(" "),_c('blockquote',[_c('p',[_c('strong',[_v("Agile designs are emergent, they’re not defined up front.")]),_v(" Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do "),_c('strong',[_v("some initial architectural modeling at the very beginning")]),_v(" of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. "),_c('sub',[_v("-- adapted from "),_c('a',{attrs:{"href":"http://agilemodeling.com/essays/agileDesign.htm"}},[_v("agilemodeling.com")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/designFundamentals-printable.html b/se-book-adapted/chapters-printable/designFundamentals-printable.html index 33e30c6680..ba6db42e1b 100644 --- a/se-book-adapted/chapters-printable/designFundamentals-printable.html +++ b/se-book-adapted/chapters-printable/designFundamentals-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Design fundamentals

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Abstraction

    What

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.

    Coupling

    What

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.

    How

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Cohesion

    What

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design fundamentals

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Abstraction

    What

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.

    Coupling

    What

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.

    How

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Cohesion

    What

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/designFundamentals-printable.page-vue-render.js b/se-book-adapted/chapters-printable/designFundamentals-printable.page-vue-render.js index 342d805c10..a5d8342522 100644 --- a/se-book-adapted/chapters-printable/designFundamentals-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/designFundamentals-printable.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('p',[_c('strong',[_v("Cohesion can be present in many forms with(this){return _c('ul',[_c('li',[_v("Code related to a single concept is kept together, e.g. the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Student")]),_v(" component handles everything related to students.")]),_v(" "),_c('li',[_v("Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.")]),_v(" "),_c('li',[_v("Code that manipulates the same data structure is kept together, e.g. the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("GameArchive")]),_v(" component handles everything related to the storage and retrieval of game sessions.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/designPatterns-printable.html b/se-book-adapted/chapters-printable/designPatterns-printable.html index 47ceec863f..135e9c7f8e 100644 --- a/se-book-adapted/chapters-printable/designPatterns-printable.html +++ b/se-book-adapted/chapters-printable/designPatterns-printable.html @@ -328,7 +328,7 @@ -

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Note that StudentList is unaware of the exact nature of the two UIs but still manages to communicate with them via an intermediary.

    Here is the generic description of the observer pattern:

    • <<Observer>> is an interface: any class that implements it can observe an <<Observable>>. Any number of <<Observer>> objects can observe (i.e. listen to changes of) the <<Observable>> object.
    • The <<Observable>> maintains a list of <<Observer>> objects. addObserver(Observer) operation adds a new <<Observer>> to the list of <<Observer>>s.
    • Whenever there is a change in the <<Observable>>, the notifyObservers() operation is called that will call the update() operation of all <<Observer>>s in the list.

    In a GUI application, how is the Controller notified when the “save” button is clicked? UI frameworks such as JavaFX have inbuilt support for the Observer pattern.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/designPatterns-printable.page-vue-render.js b/se-book-adapted/chapters-printable/designPatterns-printable.page-vue-render.js index a2a12d33ef..feb00426d3 100644 --- a/se-book-adapted/chapters-printable/designPatterns-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/designPatterns-printable.page-vue-render.js @@ -134,6 +134,6 @@ with(this){return _c('p',[_c('strong',[_v("Solution")])])} with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" is an interface: any class that implements it can observe an "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(". Any number of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" objects can observe (i.e. listen to changes of) the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" object.")]),_v(" "),_c('li',[_v("The "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" maintains a list of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" objects. "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("addObserver(Observer)")]),_v(" operation adds a new "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(" to the list of "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v("s.")]),_v(" "),_c('li',[_v("Whenever there is a change in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v(", the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("notifyObservers()")]),_v(" operation is called that will call the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("update()")]),_v(" operation of all "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("<>")]),_v("s in the list.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/documentation-printable.html b/se-book-adapted/chapters-printable/documentation-printable.html index 9c086836a9..2fc9342aef 100644 --- a/se-book-adapted/chapters-printable/documentation-printable.html +++ b/se-book-adapted/chapters-printable/documentation-printable.html @@ -172,7 +172,7 @@ -
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/documentation-printable.page-vue-render.js b/se-book-adapted/chapters-printable/documentation-printable.page-vue-render.js index 7102addb8a..e78e02c77c 100644 --- a/se-book-adapted/chapters-printable/documentation-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/documentation-printable.page-vue-render.js @@ -83,6 +83,6 @@ with(this){return _c('p',[_c('strong',[_v("A minimal JavaDoc comment example for with(this){return _c('code',{pre:true,attrs:{"class":"line-numbers hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("package")]),_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("import")]),_v(" ...\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Represents a location in a 2D space. A Point object corresponds to")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * a coordinate represented by two integers e.g., 3,6")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-class"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("class")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("Point")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// ...")]),_v("\n")]),_c('span',[_v("}\n")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/errorHandling-printable.html b/se-book-adapted/chapters-printable/errorHandling-printable.html index 7e81e8b667..ac89fda64e 100644 --- a/se-book-adapted/chapters-printable/errorHandling-printable.html +++ b/se-book-adapted/chapters-printable/errorHandling-printable.html @@ -457,7 +457,7 @@ -

    When

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/errorHandling-printable.page-vue-render.js b/se-book-adapted/chapters-printable/errorHandling-printable.page-vue-render.js index 0d36718760..5892bcf62c 100644 --- a/se-book-adapted/chapters-printable/errorHandling-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/errorHandling-printable.page-vue-render.js @@ -113,6 +113,6 @@ with(this){return _c('p',[_v("Consider two classes, "),_c('code',{pre:true,attrs with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_c('strong',[_v("It is not necessary to be 100% defensive all the time.")]),_v(" While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.")]),_v(" "),_c('p',[_v("The suitable degree of defensiveness depends on many factors such as:")]),_v(" "),_c('ul',[_c('li',[_v("How critical is the system?")]),_v(" "),_c('li',[_v("Will the code be used by programmers other than the author?")]),_v(" "),_c('li',[_v("The level of programming language support for defensive programming")]),_v(" "),_c('li',[_v("The overhead of being defensive")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/gatheringRequirements-printable.html b/se-book-adapted/chapters-printable/gatheringRequirements-printable.html index 352687b7b9..88cf869691 100644 --- a/se-book-adapted/chapters-printable/gatheringRequirements-printable.html +++ b/se-book-adapted/chapters-printable/gatheringRequirements-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Gathering requirements

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.

    User Surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.

    Observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.

    Interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.

    Focus Groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra

    Prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.

    Product Surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Gathering requirements

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.

    User Surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.

    Observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.

    Interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.

    Focus Groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra

    Prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.

    Product Surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/gatheringRequirements-printable.page-vue-render.js b/se-book-adapted/chapters-printable/gatheringRequirements-printable.page-vue-render.js index 4268bb4182..c4c8d7cdee 100644 --- a/se-book-adapted/chapters-printable/gatheringRequirements-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/gatheringRequirements-printable.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_c('span',{staticClass:"badge rounded-pill bg-success with(this){return _c('p',[_c('strong',[_v("Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product.")]),_v(" Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/gitAndGithub-printable.html b/se-book-adapted/chapters-printable/gitAndGithub-printable.html index 3cd0b38af8..a212d6b320 100644 --- a/se-book-adapted/chapters-printable/gitAndGithub-printable.html +++ b/se-book-adapted/chapters-printable/gitAndGithub-printable.html @@ -2030,7 +2030,7 @@ (1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo.
    If there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new master branch to each of them.
    (2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.
  • Some alternatives mechanisms to achieve the same can be found in this GitHub help page.
    -If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.
  • Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.

    Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/gitAndGithub-printable.page-vue-render.js b/se-book-adapted/chapters-printable/gitAndGithub-printable.page-vue-render.js index 0fddf29d00..5a42299c65 100644 --- a/se-book-adapted/chapters-printable/gitAndGithub-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/gitAndGithub-printable.page-vue-render.js @@ -371,6 +371,6 @@ with(this){return _c('p',[_c('strong',[_v("Next, sync your local repos (and fork with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_v("You can follow the steps in the simulation of a forking workflow given below to learn how to follow such a workflow.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" This activity is best done as a team.")]),_v(" "),_c('p',[_c('strong',[_v("Step 1. One member: set up the team org and the team repo.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['1.1)', '1.2)', '1.3)', '1.4)', '1.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.1)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/articles/creating-a-new-organization-from-scratch/"}},[_c('strong',[_v("Create a GitHub organization")])]),_v(" for your team, if you don't have one already. The org name is up to you. We'll refer to this organization as "),_c('em',[_v("team org")]),_v(" from now on.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.2)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/enterprise/2.10/admin/guides/user-management/creating-teams/"}},[_c('strong',[_v("Add a team")])]),_v(" called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" to your team org.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.3)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/enterprise/2.0/admin/guides/user-management/adding-or-inviting-people-to-teams/"}},[_c('strong',[_v("Add team members")])]),_v(" to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" team.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.4)")]),_c('div',[_c('p',[_c('strong',[_v("Fork")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/se-edu/samplerepo-workflow-practice"}},[_v("se-edu/samplerepo-workflow-practice")]),_v(" to your team org. We'll refer to this as the "),_c('em',[_v("team repo")]),_v(".")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.5)")]),_c('div',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://help.github.com/articles/managing-team-access-to-an-organization-repository/"}},[_v("Add the forked repo")]),_v(" to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" team.")]),_v(" Give write access.")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 2. Each team member: create PRs via own fork.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['2.1)', '2.2)', '2.3)', '2.4)', '2.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.1)")]),_c('div',[_c('p',[_c('strong',[_v("Fork that repo")]),_v(" from your team org to your own GitHub account.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.2)")]),_c('div',[_c('p',[_c('strong',[_v("Create a branch")]),_v(" named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-{your name}-info")]),_v(" (e.g. "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-johnTan-info")]),_v(") in the local repo.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.3)")]),_c('div',[_c('p',[_c('strong',[_v("Add a file")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yourName.md")]),_v(" into the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("members")]),_v(" directory (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("members/johnTan.md")]),_v(") containing some info about you into that branch.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.4)")]),_c('div',[_c('p',[_c('strong',[_v("Push that branch to your fork")]),_v(".")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.5)")]),_c('div',[_c('p',[_c('strong',[_v("Create a PR")]),_v(" from that branch to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch of the team repo.")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 3. For each PR: review, update, and merge.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['3.1)', '3.2)', '3.3)', '3.4)', '3.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.1)")]),_c('div',[_c('p',[_c('strong',[_v("[A team member (not the PR author)] Review the PR")]),_v(" by adding comments (can be just dummy comments).")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.2)")]),_c('div',[_c('p',[_c('strong',[_v("[PR author] Update the PR")]),_v(" by pushing more commits to it, to simulate updating the PR based on review comments.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.3)")]),_c('div',[_c('p',[_c('strong',[_v("[Another team member] Approve and merge")]),_v(" the PR using the GitHub interface.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.4)")]),_c('div',[_c('p',[_c('strong',[_v("[All members]")]),_v(" "),_c('a',{attrs:{"href":"https://help.github.com/articles/syncing-a-fork/"}},[_c('strong',[_v("Sync your local repo (and your fork)")]),_v(" with upstream repo")]),_v(". In this case, your "),_c('em',[_v("upstream repo")]),_v(" is the repo in your team org.")]),_v(" "),_c('ul',[_c('li',[_v("The basic mechanism for this has two steps (which you can do using Git CLI or any Git GUI):"),_c('br'),_v("\n(1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo."),_c('br'),_v("\nIf there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to each of them."),_c('br'),_v("\n(2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.")]),_v(" "),_c('li',[_v("Some alternatives mechanisms to achieve the same can be found in "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork"}},[_v("this GitHub help page")]),_v("."),_c('br'),_v("\nIf you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 4. Create conflicting PRs.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['4.1)', '4.2)', '4.3)', '4.4)', '4.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("4.1)")]),_c('div',[_c('p',[_c('strong',[_v("[One member]: Update README:")]),_v(" In the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, remove John Doe and Jane Doe from the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(", commit, and push to the main repo.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("4.2)")]),_c('div',[_c('p',[_c('strong',[_v("[Each team member] Create a PR")]),_v(" to add yourself under the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Team Members")]),_v(" section in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(". Use a new branch for the PR e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-johnTan-name")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 5. Merge conflicting PRs")]),_v(" one at a time. Before merging a PR, you’ll have to resolve conflicts.")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['5.1)', '5.2)', '5.3)', '5.4)', '5.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.1)")]),_c('div',[_c('p',[_v("[Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.2)")]),_c('div',[_c('p',[_c('strong',[_v("[PR author] Resolve the conflict locally")]),_v(":")]),_v(" "),_c('ol',[_c('li',[_v("Pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch from the repo in your team org.")]),_v(" "),_c('li',[_v("Merge the pulled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your PR branch.")]),_v(" "),_c('li',[_v("Resolve the merge conflict that crops up during the merge.")]),_v(" "),_c('li',[_v("Push the updated PR branch to your fork.")])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.3)")]),_c('div',[_c('p',[_c('strong',[_v("[Another member or the PR author]: Merge the de-conflicted PR")]),_v(": When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/ides-printable.html b/se-book-adapted/chapters-printable/ides-printable.html index a216274380..f8ca65ebe2 100644 --- a/se-book-adapted/chapters-printable/ides-printable.html +++ b/se-book-adapted/chapters-printable/ides-printable.html @@ -14,7 +14,7 @@

    IDEs

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.

    Debugging

    What

    Debugging is the process of discovering defects in the program. Here are some approaches to debugging:

    • Bad -- By inserting temporary print statements: This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. Exiting process() method, x is 5.347. This approach is not recommended due to these reasons:
      • Incurs extra effort when inserting and removing the print statements.
      • These extraneous program modifications increase the risk of introducing errors into the program.
      • These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.
    • Bad -- By manually tracing through the code: Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons: -
      • It is a difficult, time consuming, and error-prone technique.
      • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
    • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • It is a difficult, time consuming, and error-prone technique.
    • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
  • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.
  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/ides-printable.page-vue-render.js b/se-book-adapted/chapters-printable/ides-printable.page-vue-render.js index 6e12fd4305..35b549230a 100644 --- a/se-book-adapted/chapters-printable/ides-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/ides-printable.page-vue-render.js @@ -23,6 +23,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"debugging"}},[_c('span',[_v("D with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Debugging")]),_v(" is the process of discovering defects in the program.")]),_v(" Here are some approaches to debugging:")]),_v(" "),_c('ul',[_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('strong',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" -- "),_c('strong',[_v("By inserting temporary print statements")]),_v(": This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Exiting process() method, x is 5.347")]),_v(". This approach is not recommended due to these reasons:\n"),_c('ul',[_c('li',[_v("Incurs extra effort when inserting and removing the print statements.")]),_v(" "),_c('li',[_v("These extraneous program modifications increase the risk of introducing errors into the program.")]),_v(" "),_c('li',[_v("These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.")])])]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"red"}},[_c('span',[_c('strong',[_c('span',{staticClass:"fas fa-thumbs-down",attrs:{"aria-hidden":"true"}}),_v(" Bad")])])]),_v(" -- "),_c('strong',[_v("By manually tracing through the code")]),_v(": Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons:\n"),_c('ul',[_c('li',[_v("It is a difficult, time consuming, and error-prone technique.")]),_v(" "),_c('li',[_v("If you didn't spot the error while writing the code, you might not spot the error when reading the code either.")])])]),_v(" "),_c('li',[_c('span',{staticStyle:{"color":"green"}},[_c('span',[_c('strong',[_c('span',{staticClass:"fas fa-thumbs-up",attrs:{"aria-hidden":"true"}}),_v(" Good")])])]),_v(" -- "),_c('strong',[_v("Using a debugger")]),_v(": A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. "),_c('strong',[_v("This is the recommended approach for debugging")]),_v(".")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/integration-printable.html b/se-book-adapted/chapters-printable/integration-printable.html index 865e50bc4d..e746942a20 100644 --- a/se-book-adapted/chapters-printable/integration-printable.html +++ b/se-book-adapted/chapters-printable/integration-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Integration

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.

    Approaches

    'Late and One Time' vs 'Early and Frequent'

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:

    Big-Bang vs Incremental Integration

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:

    Build Automation

    What

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.

    Continuous Integration and Continuous Deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Integration

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.

    Approaches

    'Late and One Time' vs 'Early and Frequent'

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:

    Big-Bang vs Incremental Integration

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:

    Build Automation

    What

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.

    Continuous Integration and Continuous Deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/integration-printable.page-vue-render.js b/se-book-adapted/chapters-printable/integration-printable.page-vue-render.js index 36ba778eff..e6e50c27b8 100644 --- a/se-book-adapted/chapters-printable/integration-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/integration-printable.page-vue-render.js @@ -62,6 +62,6 @@ with(this){return _c('p',[_c('strong',[_v("An extreme application of build autom with(this){return _c('p',[_c('strong',[_v("A natural extension of CI is "),_c('em',[_v("Continuous Deployment (CD)")]),_v(" where the changes are not only integrated continuously, but also deployed to end-users at the same time.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/intellij-printable.html b/se-book-adapted/chapters-printable/intellij-printable.html index 53c49556f5..9d48f123a0 100644 --- a/se-book-adapted/chapters-printable/intellij-printable.html +++ b/se-book-adapted/chapters-printable/intellij-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/se-book-adapted/chapters-printable/intellij-printable.page-vue-render.js b/se-book-adapted/chapters-printable/intellij-printable.page-vue-render.js index bc843cecdd..4d8259dbfd 100644 --- a/se-book-adapted/chapters-printable/intellij-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/intellij-printable.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/textbook.css"}}),_v(" "),_c('link',{attrs:{"rel":"stylesheet","href":"/website/book/css/print.css"}}),_v(" "),_c('div',{staticClass:"website-content"},[_c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"intellij-idea"}},[_c('span',[_v("IntelliJ IDEA")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intellij-idea","onclick":"event.stopPropagation()"}})])])]),_v(" "),_c('div',[_c('small',[_c('span',{staticClass:"dimmed"},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})]),_v(" This is a "),_c('strong',[_v("printer-friendly")]),_v(" version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.")])])]),_v(" "),_c('div',{staticClass:"indented-less"})])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/modeling-printable.html b/se-book-adapted/chapters-printable/modeling-printable.html index f2614aded0..a7f5052a4d 100644 --- a/se-book-adapted/chapters-printable/modeling-printable.html +++ b/se-book-adapted/chapters-printable/modeling-printable.html @@ -113,7 +113,7 @@ Loading...

    UML: Sequence Diagrams: Reference Frames

    Loading... -

    Use Case Diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:

    Modeling a solution

    Introduction

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.

    Basic

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Use Case Diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:

    Modeling a solution

    Introduction

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.

    Basic

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/modeling-printable.page-vue-render.js b/se-book-adapted/chapters-printable/modeling-printable.page-vue-render.js index b3da6212dd..e027c0477a 100644 --- a/se-book-adapted/chapters-printable/modeling-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/modeling-printable.page-vue-render.js @@ -161,6 +161,6 @@ with(this){return _c('p',[_v("Note that the behavior of the "),_c('code',{pre:tr with(this){return _c('p',[_v("Given below are the interactions between the player and the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("TextUi")]),_v(" for the whole game.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/oop-printable.html b/se-book-adapted/chapters-printable/oop-printable.html index c1cd019fc1..c60570ea5b 100644 --- a/se-book-adapted/chapters-printable/oop-printable.html +++ b/se-book-adapted/chapters-printable/oop-printable.html @@ -903,7 +903,7 @@ -

    Polymorphism

    What :

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".

    How :

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    More

    Miscellaneous

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Polymorphism

    What :

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".

    How :

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    More

    Miscellaneous

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/oop-printable.page-vue-render.js b/se-book-adapted/chapters-printable/oop-printable.page-vue-render.js index 996d50a6d4..7578fedd71 100644 --- a/se-book-adapted/chapters-printable/oop-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/oop-printable.page-vue-render.js @@ -281,6 +281,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"more"}},[_c('span',[_v("More") with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_c('strong',[_v("What is the difference between a Class, an Abstract Class, and an Interface?")])]),_v(" "),_c('ul',[_c('li',[_v("An interface is a behavior specification with no implementation.")]),_v(" "),_c('li',[_v("A class is a behavior specification + implementation.")]),_v(" "),_c('li',[_v("An abstract class is a behavior specification + a possibly incomplete implementation.")])]),_v(" "),_c('p',[_c('strong',[_v("How does "),_c('em',[_v("overriding")]),_v(" differ from "),_c('em',[_v("overloading")]),_v("?")])]),_v(" "),_c('p',[_v("Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.")]),_v(" "),_c('p',[_v("Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/principles-printable.html b/se-book-adapted/chapters-printable/principles-printable.html index 28230da43c..9cfa6252fe 100644 --- a/se-book-adapted/chapters-printable/principles-printable.html +++ b/se-book-adapted/chapters-printable/principles-printable.html @@ -88,7 +88,7 @@ -

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/principles-printable.page-vue-render.js b/se-book-adapted/chapters-printable/principles-printable.page-vue-render.js index 4591c29a04..290afa6524 100644 --- a/se-book-adapted/chapters-printable/principles-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/principles-printable.page-vue-render.js @@ -53,6 +53,6 @@ with(this){return _c('li',[_v("Objects created/instantiated in "),_c('code',{pre with(this){return _c('p',[_c('strong',[_v("LoD aims to prevent objects from navigating the internal structures of other objects.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/processModels-printable.html b/se-book-adapted/chapters-printable/processModels-printable.html index 1441a18dbc..8b92d5897f 100644 --- a/se-book-adapted/chapters-printable/processModels-printable.html +++ b/se-book-adapted/chapters-printable/processModels-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    SDLC process models

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.

    Sequential Models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.

    Iterative Models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.

    Agile Models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.

    Example process models

    XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.

    Scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    SDLC process models

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.

    Sequential Models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.

    Iterative Models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.

    Agile Models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.

    Example process models

    XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.

    Scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/processModels-printable.page-vue-render.js b/se-book-adapted/chapters-printable/processModels-printable.page-vue-render.js index 9b66286962..0d29e9d9f0 100644 --- a/se-book-adapted/chapters-printable/processModels-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/processModels-printable.page-vue-render.js @@ -62,6 +62,6 @@ with(this){return _c('p',[_c('strong',[_c('em',[_v("Pair programming, CRC cards, with(this){return _c('p',[_c('strong',[_c('em',[_v("Daily Scrum")]),_v(" is another key scrum practice")]),_v(". The description below was adapted from "),_c('a',{attrs:{"href":"https://www.mountaingoatsoftware.com/agile/scrum/meetings/daily-scrum"}},[_v("https://www.mountaingoatsoftware.com")]),_v(" (emphasis added):")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/projectPlanning-printable.html b/se-book-adapted/chapters-printable/projectPlanning-printable.html index 87bba4f23b..2b36d309b6 100644 --- a/se-book-adapted/chapters-printable/projectPlanning-printable.html +++ b/se-book-adapted/chapters-printable/projectPlanning-printable.html @@ -20,7 +20,7 @@ Implementation
    1. User Interface
    2. Game Logic
    3. Persistency Support
    4.5 man day -
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested

    Buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.

    Issue Trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):

    GANTT Charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested

    Buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.

    Issue Trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):

    GANTT Charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/projectPlanning-printable.page-vue-render.js b/se-book-adapted/chapters-printable/projectPlanning-printable.page-vue-render.js index 362385d6aa..132e34e13b 100644 --- a/se-book-adapted/chapters-printable/projectPlanning-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/projectPlanning-printable.page-vue-render.js @@ -35,6 +35,6 @@ with(this){return _c('p',[_c('strong',[_v("Issue trackers (sometimes called bug with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("Gantt chart")]),_v(" is a 2-D bar-chart, drawn as "),_c('em',[_v("time vs tasks")])]),_v(" (represented by horizontal bars).")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/qualityAssurance-printable.html b/se-book-adapted/chapters-printable/qualityAssurance-printable.html index fbff6d054a..fa4d6f4856 100644 --- a/se-book-adapted/chapters-printable/qualityAssurance-printable.html +++ b/se-book-adapted/chapters-printable/qualityAssurance-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Quality assurance

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.

    Validation vs Verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).

    Code reviews

    What

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Static analysis

    What

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.

    Formal verification

    What

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Quality assurance

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.

    Validation vs Verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).

    Code reviews

    What

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Static analysis

    What

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.

    Formal verification

    What

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/qualityAssurance-printable.page-vue-render.js b/se-book-adapted/chapters-printable/qualityAssurance-printable.page-vue-render.js index f742520d98..4c9584137b 100644 --- a/se-book-adapted/chapters-printable/qualityAssurance-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/qualityAssurance-printable.page-vue-render.js @@ -68,6 +68,6 @@ with(this){return _c('ul',[_c('li',[_c('strong',[_v("Formal verification can be with(this){return _c('ul',[_c('li',[_v("It only proves the compliance with the specification, but not the actual utility of the software.")]),_v(" "),_c('li',[_v("It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, "),_c('strong',[_v("formal verifications are more commonly used in safety-critical software such as flight control systems")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/refactoring-printable.html b/se-book-adapted/chapters-printable/refactoring-printable.html index 750d9a92ae..6e782fdbd5 100644 --- a/se-book-adapted/chapters-printable/refactoring-printable.html +++ b/se-book-adapted/chapters-printable/refactoring-printable.html @@ -350,7 +350,7 @@

    Some IDEs have builtin support for basic refactorings such as automatically renaming a variable/method/class in all places it has been used.

    Refactoring, even if done with the aid of an IDE, may still result in regressions. Therefore, each small refactoring should be followed by regression testing.

    When

    One way to identify refactoring opportunities is by code smells.

    A code smell is a surface indication that usually corresponds to a deeper problem in the system. First, a smell is by definition something that's quick to spot. Second, smells don't always indicate a problem.
    --adapted from https://martinfowler.com/bliki/CodeSmell.html

    An example (from the same source as above) is the code smell data class i.e., a class with all data and no behavior. When you encounter the such a class, you can explore if refactoring it to move the corresponding behavior into that class is appropriate. Some more examples:

    Periodic refactoring is a good way to pay off the technical debt a codebase has accumulated.

    Software systems are prone to the build up of cruft - deficiencies in internal quality that make it harder than it would ideally be to modify and extend the system further.Technical Debt is a metaphor, coined by Ward Cunningham, that frames how to think about dealing with this cruft, thinking of it like a financial debt. The extra effort that it takes to add new features is the interest paid on the debt.
    ---https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/refactoring-printable.page-vue-render.js b/se-book-adapted/chapters-printable/refactoring-printable.page-vue-render.js index 77a7296888..824f226b12 100644 --- a/se-book-adapted/chapters-printable/refactoring-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/refactoring-printable.page-vue-render.js @@ -32,6 +32,6 @@ with(this){return _c('ol',[_c('li',[_c('a',{attrs:{"href":"https://refactoring.c with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_c('strong',[_v("One way to identify refactoring opportunities is by "),_c('em',[_v("code smells")]),_v(".")])]),_v(" "),_c('blockquote',[_c('p',[_v("A "),_c('em',[_v("code smell")]),_v(" is a surface indication that usually corresponds to a deeper problem in the system.\nFirst, a smell is by definition something that's quick to spot. Second, smells don't always indicate a problem."),_c('br'),_v("\n--adapted from "),_c('a',{attrs:{"href":"https://martinfowler.com/bliki/CodeSmell.html"}},[_v("https://martinfowler.com/bliki/CodeSmell.html")])])]),_v(" "),_c('p',[_v("An example (from the same source as above) is the code smell "),_c('em',[_v("data class")]),_v(" i.e., a class with all data and no behavior. When you encounter the such a class, you can explore if refactoring it to move the corresponding behavior into that class is appropriate. Some more examples:")]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://refactoring.guru/smells/long-method"}},[_v("Long Method")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.guru/smells/large-class"}},[_v("Large Class")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.guru/smells/primitive-obsession"}},[_v("Primitive Obsession")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.guru/smells/temporary-field"}},[_v("Temporary Field")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://refactoring.guru/smells/shotgun-surgery"}},[_v("Shotgun Surgery")])])]),_v(" "),_c('p',[_c('strong',[_v("Periodic refactoring is a good way to pay off the "),_c('em',[_v("technical debt")])]),_v(" a codebase has accumulated.")]),_v(" "),_c('blockquote',[_c('p',[_v("Software systems are prone to the build up of "),_c('strong',[_v("cruft")]),_v(" - deficiencies in internal quality that make it harder than it would ideally be to modify and extend the system further.Technical Debt is a metaphor, coined by Ward Cunningham, that frames how to think about dealing with this cruft, thinking of it like a financial debt. The extra effort that it takes to add new features is the interest paid on the debt."),_c('br'),_v("\n--"),_c('a',{attrs:{"href":"https://martinfowler.com/bliki/TechnicalDebt.html"}},[_v("https://martinfowler.com/bliki/TechnicalDebt.html")])])]),_v(" "),_c('p',[_v("While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is "),_c('em',[_v("too much")]),_v(" refactoring? "),_c('strong',[_v("It is too much refactoring when the benefits no longer justify the cost.")]),_v(" The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. "),_c('a',{attrs:{"href":"https://refactoring.com/catalog/extractMethod.html"}},[_c('em',[_v("extract method")])]),_v(" vs "),_c('a',{attrs:{"href":"https://refactoring.com/catalog/inlineMethod.html"}},[_c('em',[_v("inline method")])]),_v(").")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/requirements-printable.html b/se-book-adapted/chapters-printable/requirements-printable.html index f74c018ca6..e0a1d0ebff 100644 --- a/se-book-adapted/chapters-printable/requirements-printable.html +++ b/se-book-adapted/chapters-printable/requirements-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Requirements

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.

    Non-Functional Requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Quality of Requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete

    Prioritizing Requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Requirements

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.

    Non-Functional Requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Quality of Requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete

    Prioritizing Requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/requirements-printable.page-vue-render.js b/se-book-adapted/chapters-printable/requirements-printable.page-vue-render.js index fef6f8b9fa..bff6b70af9 100644 --- a/se-book-adapted/chapters-printable/requirements-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/requirements-printable.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('ul',[_c('li',[_v("Consistent")]),_v(" "),_c('li',[_v("Non- with(this){return _c('p',[_c('strong',[_v("Requirements can be prioritized based on the importance and urgency")]),_v(", while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/reuse-printable.html b/se-book-adapted/chapters-printable/reuse-printable.html index fc953eaf0f..7b04dfb732 100644 --- a/se-book-adapted/chapters-printable/reuse-printable.html +++ b/se-book-adapted/chapters-printable/reuse-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Reuse

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.

    When

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    APIs

    What

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.

    Libraries

    What

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.

    How

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.

    Frameworks

    What

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks vs Libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.

    Platforms

    What

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Reuse

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Introduction

    What

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.

    When

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    APIs

    What

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.

    Libraries

    What

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.

    How

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.

    Frameworks

    What

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks vs Libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.

    Platforms

    What

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/reuse-printable.page-vue-render.js b/se-book-adapted/chapters-printable/reuse-printable.page-vue-render.js index b200df4a1f..e61e93cdbd 100644 --- a/se-book-adapted/chapters-printable/reuse-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/reuse-printable.page-vue-render.js @@ -56,6 +56,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"platforms"}},[_c('span',[_v("P with(this){return _c('p',[_c('strong',[_v("A "),_c('em',[_v("platform")]),_v(" provides a runtime environment for applications.")]),_v(" A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/revisionControl-printable.html b/se-book-adapted/chapters-printable/revisionControl-printable.html index 5d7ab6c10f..8a877b5772 100644 --- a/se-book-adapted/chapters-printable/revisionControl-printable.html +++ b/se-book-adapted/chapters-printable/revisionControl-printable.html @@ -14,7 +14,7 @@

    Revision control

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    What

    Given below is a general introduction to revision control, adapted from bryan-mercurial-guide:

    Revision control is the process of managing multiple versions of a piece of information. In its simplest form, this is something that many people do by hand: every time you modify a file, save it under a new name that contains a number, each one higher than the number of the preceding version.

    Manually managing multiple versions of even a single file is an error-prone task, though, so software tools to help automate this process have long been available. The earliest automated revision control tools were intended to help a single user to manage revisions of a single file. Over the past few decades, the scope of revision control tools has expanded greatly; they now manage multiple files, and help multiple people to work together. The best modern revision control tools have no problem coping with thousands of people working together on projects that consist of hundreds of thousands of files.

    There are a number of reasons why you or your team might want to use an automated revision control tool for a project.

    • It will track the history and evolution of your project, so you don't have to. For every change, you'll have a log of who made it; why they made it; when they made it; and what the change was.
    • It makes it easier for you to collaborate when you're working with other people. For example, when people more or less simultaneously make potentially incompatible changes, the software will help you to identify and resolve those conflicts.
    • It can help you to recover from mistakes. If you make a change that later turns out to be an error, you can revert to an earlier version of one or more files. In fact, a really good revision control tool will even help you to efficiently figure out exactly when a problem was introduced.
    • It will help you to work simultaneously on, and manage the drift between, multiple versions of your project.

    Most of these reasons are equally valid, at least in theory, whether you're working on a project by yourself, or with a hundred other people.



    Revision: A revision (some seem to use it interchangeably with version while others seem to distinguish the two -- here, let us treat them as the same, for simplicity) is a state of a piece of information at a specific time that is a result of some changes to it e.g., if you modify the code and save the file, you have a new revision (or a new version) of that file.

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Revision control software are also known as Version Control Software (VCS), and by a few other names.

    Git is the most widely used RCS today. Other RCS tools include Mercurial, Subversion (SVN), Perforce, CVS (Concurrent Versions System), Bazaar, TFS (Team Foundation Server), and Clearcase.

    Github is a web-based project hosting platform for projects using Git for revision control. Other similar services include GitLab, BitBucket, and SourceForge.

    Repositories

    The repository is the database that stores the revision history. Suppose you want to apply revision control on files in a directory called ProjectFoo. In that case, you need to set up a repo (short for repository) in the ProjectFoo directory, which is referred to as the working directory of the repo. For example, Git uses a hidden folder named .git inside the working directory, to store the database of the working directory's revision history.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    You can have multiple repos in your computer, each repo revision-controlling files of a different working directory, for examples, files of different projects.



    Saving History

    Tracking and ignoring

    In a repo, you can specify which files to track and which files to ignore. For example, we can configure Git to ignore temporary files created during the build/test process, as it does not make sense to track their version history.

    Staging and committing

    Committing saves a snapshot of the current state of the tracked files in the revision control history. Such a snapshot is also called a commit (i.e. the noun).

    Commit (noun): a change (aka a revision) saved in the Git revision history.
    (verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    When ready to commit, you first add the specific changes you want to commit to a staging area. This intermediate step allows you to commit only some changes while saving other changes for a later commit.

    Stage (verb): Instructing Git to prepare a file for committing.



    Using History

    RCS tools store the history of the working directory as a series of commits. This means you should commit after each change that you want the RCS to 'remember'.

    Each commit in a repo is a recorded point in the history of the project that is uniquely identified by an auto-generated hash e.g. a16043703f28e5b3dab95915f5c5e5bf4fdc5fc1.

    You can tag a specific commit with a more easily identifiable name e.g. v1.0.2.

    To see what changed between two points of the history, you can ask the RCS tool to diff the two commits in concern.

    To restore the state of the working directory at a point in the past, you can checkout the commit in concern. i.e., you can traverse the history of the working directory simply by checking out the commits you are interested in.

    Remote Repositories

    Remote repositories are repos that are hosted on remote computers and allow remote access. They are especially useful for sharing the revision history of a codebase among team members of a multi-person project. They can also serve as a remote backup of your codebase.

    It is possible to set up your own remote repo on a server, but the easier option is to use a remote repo hosting service such as GitHub or BitBucket.

    You can clone a repo to create a copy of that repo in another location on your computer. The copy will even have the revision history of the original repo i.e., identical to the original repo. For example, you can clone a remote repo onto your computer to create a local copy of the remote repo.

    When you clone from a repo, the original repo is commonly referred to as the upstream repo. A repo can have multiple upstream repos. For example, let's say a repo repo1 was cloned as repo2 which was then cloned as repo3. In this case, repo1 and repo2 are upstream repos of repo3.

    You can pull (or fetch) from one repo to another, to receive new commits in the second repo, but only if the repos have a shared history. Let's say some new commits were added to the after you cloned it, and you would like to copy over those new commits to your own clone i.e., sync your clone with the upstream repo. In that case, you can pull from the upstream repo to your clone.

    You can push new commits in one repo to another repo which will copy the new commits onto the destination repo. Note that pushing to a repo requires you to have write-access to it. Furthermore, you can push between repos only if those repos have a shared history among them (i.e., one was created by copying the other at some point in the past).

    Cloning, pushing, and pulling/fetching can be done between two local repos too, although it is more common for them to involve a remote repo.

    A repo can work with any number of other repositories as long as they have a shared history e.g., repo1 can pull from (or push to) repo2 and repo3 if they have a shared history between them.

    A fork is a remote copy of a remote repo. As you know, cloning creates a local copy of a repo. In contrast, forking creates a remote copy of a repo hosted on remote service such as GitHub. This is particularly useful if you want to play around with a GitHub repo, but you don't have write permissions to it; you can simply fork the repo and do whatever you want with the fork as you are the owner of the fork.

    A pull request (PR for short) is a mechanism for contributing code to a remote repo i.e., "I'm requesting you to pull my proposed changes to your repo". It's feature provided by RCS platforms such as GitHub. For this to work, the two repos must have a shared history. The most common case is sending PRs from a fork to its repo.

    Here is a scenario that includes all the concepts introduced above (click inside the slide to advance the animation):

    Branching

    Branching is the process of evolving multiple versions of the software in parallel. For example, one team member can create a new branch and add an experimental feature to it while the rest of the team keeps working on another branch. Branches can be given names e.g. master, release, dev.

    A branch can be merged into another branch. Merging sometimes results in a new commit (called the merge commit) being created, to represent the cumulative changes done in the receiving branch as a result of the merge.

    Branching and merging

    Merge conflicts happen when you try to merge two branches that had changed the same part of the code and the RCS cannot decide which changes to keep. In those cases, you have to ‘resolve’ the conflicts manually.

    DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach

    Forking Flow

    In the forking workflow, the 'official' version of the software is kept in a remote repo designated as the 'main repo'. All team members fork the main repo and create pull requests from their fork to the main repo.

    To illustrate how the workflow goes, let’s assume Jean wants to fix a bug in the code. Here are the steps:

    1. Jean creates a separate branch in her local repo and fixes the bug in that branch.
      Common mistake: Doing the proposed changes in the master branch -- if Jean does that, she will not be able to have more than one PR open at any time because any changes to the master branch will be reflected in all open PRs.
    2. Jean pushes the branch to her fork.
    3. Jean creates a pull request from that branch in her fork to the main repo.
    4. Other members review Jean’s pull request.
    5. If reviewers suggested any changes, Jean updates the PR accordingly.
    6. When reviewers are satisfied with the PR, one of the members (usually the team lead or a designated 'maintainer' of the main repo) merges the PR, which brings Jean’s code to the main repo.
    7. Other members, realizing there is new code in the upstream repo, sync their forks with the new upstream repo (i.e. the main repo). This is done by pulling the new code to their own local repo and pushing the updated code to their own fork. If there are unmerged branches in the local repo, they can be updated too e.g., by merging the new master branch to each of them.
      Possible mistake: Creating another 'reverse' PR from the team repo to the team member's fork to sync the member's fork with the merged code. PRs are meant to go from downstream repos to upstream repos, not in the other direction.

    One main benefit of this workflow is that it does not require most contributors to have write permissions to the main repository. Only those who are merging PRs need write permissions. -The main drawback of this workflow is the extra overhead of sending everything through forks.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +The main drawback of this workflow is the extra overhead of sending everything through forks.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/revisionControl-printable.page-vue-render.js b/se-book-adapted/chapters-printable/revisionControl-printable.page-vue-render.js index 3086ac1305..305d0d3434 100644 --- a/se-book-adapted/chapters-printable/revisionControl-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/revisionControl-printable.page-vue-render.js @@ -95,6 +95,6 @@ with(this){return _c('p',[_c('strong',[_v("Distributed RCS (DRCS for short, also with(this){return _c('p',[_c('strong',[_v("In the "),_c('em',[_v("forking workflow")]),_v(", the 'official' version of the software is kept in a remote repo designated as the 'main repo'. All team members fork the main repo and create pull requests from their fork to the main repo.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/softwareEngineering-printable.html b/se-book-adapted/chapters-printable/softwareEngineering-printable.html index ebf6dcec79..a029f7cfd8 100644 --- a/se-book-adapted/chapters-printable/softwareEngineering-printable.html +++ b/se-book-adapted/chapters-printable/softwareEngineering-printable.html @@ -42,7 +42,7 @@ it becomes obsolete in terms of its concepts. But implementation of real products demands phasing and quantizing. The obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts. The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.

    This then is programming, both a tar pit in which many efforts have floundered and a creative activity with joys -and woes all its own. For many, the joys far outweigh the woes....

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +and woes all its own. For many, the joys far outweigh the woes....

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/softwareEngineering-printable.page-vue-render.js b/se-book-adapted/chapters-printable/softwareEngineering-printable.page-vue-render.js index 1796b66207..9b05d70480 100644 --- a/se-book-adapted/chapters-printable/softwareEngineering-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/softwareEngineering-printable.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('blockquote',[_c('p',[_c('strong',[_v("Why is programming f with(this){return _c('blockquote',[_c('p',[_c('strong',[_v("Not all is delight, however, and knowing the inherent woes makes it easier to bear them when they appear.")])]),_v(" "),_c('p',[_c('strong',[_v("First, one must perform perfectly.")]),_v(" The computer resembles the magic of legend in this respect, too. If one character,\none pause, of the incantation is not strictly in proper form, the magic doesn't work. Human beings are not accustomed to being perfect,\nand few areas of human activity demand it. Adjusting to the requirement for perfection is, I think, the most difficult part of learning to program.")]),_v(" "),_c('p',[_c('strong',[_v("Next, other people set one's objectives, provide one's resources, and furnish one's information.")]),_v(" One rarely controls the\ncircumstances of his work, or even its goal. In management terms, one's authority is not sufficient for his responsibility.\nIt seems that in all fields, however, the jobs where things get done never have formal authority commensurate with responsibility.\nIn practice, actual (as opposed to formal) authority is acquired from the very momentum of accomplishment.")]),_v(" "),_c('p',[_v("The dependence upon others has a particular case that is especially painful for the system programmer. He depends upon other\npeople's programs. These are often maldesigned, poorly implemented, incompletely delivered (no source code or test cases),\nand poorly documented. So he must spend hours studying and fixing things that in an ideal world would be complete, available, and usable.")]),_v(" "),_c('p',[_c('strong',[_v("The next woe is that designing grand concepts is fun; finding nitty little bugs is just work.")]),_v(" With any creative activity\ncome dreary hours of tedious, painstaking labor, and programming is no exception.")]),_v(" "),_c('p',[_c('strong',[_v("Next, one finds that debugging has a linear convergence, or worse")]),_v(", where one somehow expects a quadratic sort of approach to the end.\nSo testing drags on and on, the last difficult bugs taking more time to find than the first.")]),_v(" "),_c('p',[_c('strong',[_v("The last woe, and sometimes the last straw, is that the product over which one has labored so long appears to be\nobsolete upon (or before) completion.")]),_v(" Already colleagues and competitors are in hot pursuit of new and better ideas.\nAlready the displacement of one's thought-child is not only conceived, but scheduled.")]),_v(" "),_c('p',[_v("This always seems worse than it really is. The new and better product is generally not available when one completes his own;\nit is only talked about. It, too, will require months of development. The real tiger is never a match for the paper one,\nunless actual use is wanted. Then the virtues of reality have a satisfaction all their own.")]),_v(" "),_c('p',[_v("Of course the technological base on which one builds is always advancing. As soon as one freezes a design,\nit becomes obsolete in terms of its concepts. But implementation of real products demands phasing and quantizing.\nThe obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts.\nThe challenge and the mission are to find real solutions to real problems on actual schedules with available resources.")]),_v(" "),_c('p',[_v("This then is programming, both a tar pit in which many efforts have floundered and a creative activity with joys\nand woes all its own. "),_c('strong',[_v("For many, the joys far outweigh the woes....")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/specifyingRequirements-printable.html b/se-book-adapted/chapters-printable/specifyingRequirements-printable.html index 7dd5f7ec3b..ddd3f8f9e4 100644 --- a/se-book-adapted/chapters-printable/specifyingRequirements-printable.html +++ b/se-book-adapted/chapters-printable/specifyingRequirements-printable.html @@ -239,7 +239,7 @@ Use case: UC23 - Transfer Money
    Actor: User
    Preconditions: User is logged in.
    Guarantees:

    • Money will be deducted from the source account only if the transfer to the destination account is successful.
    • The transfer will not result in the account balance going below the minimum balance required.

    MSS:

    1. User chooses to transfer money.
    2. OBS requests for details for the transfer.
      -...

    Usage

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.

    Glossary

    What

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.

    Supplementary requirements

    What

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...

    Usage

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.

    Glossary

    What

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.

    Supplementary requirements

    What

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/specifyingRequirements-printable.page-vue-render.js b/se-book-adapted/chapters-printable/specifyingRequirements-printable.page-vue-render.js index bf433a7c14..158f97ff81 100644 --- a/se-book-adapted/chapters-printable/specifyingRequirements-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/specifyingRequirements-printable.page-vue-render.js @@ -164,6 +164,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"supplementary-requirements"}}, with(this){return _c('strong',[_v("A "),_c('em',[_v("supplementary requirements")]),_v(" section can be used to capture "),_c('em',[_v("requirements that do not fit elsewhere")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/teamwork-printable.html b/se-book-adapted/chapters-printable/teamwork-printable.html index f30d2e15c3..860cbd4b2b 100644 --- a/se-book-adapted/chapters-printable/teamwork-printable.html +++ b/se-book-adapted/chapters-printable/teamwork-printable.html @@ -12,7 +12,7 @@ const baseUrl = '/website' -

    Teamwork

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Team Structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Teamwork

    This is a printer-friendly version. It omits exercises, optional topics (i.e., four-star topics), and other extra content such as learning outcomes.

    Team Structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/teamwork-printable.page-vue-render.js b/se-book-adapted/chapters-printable/teamwork-printable.page-vue-render.js index e989bb3b17..3194cbbd67 100644 --- a/se-book-adapted/chapters-printable/teamwork-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/teamwork-printable.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_c('strong',[_v("Strict hierarchy team")])])} with(this){return _c('p',[_v("At the opposite extreme of an egoless team, a strict hierarchy team has "),_c('strong',[_v("a strictly defined organization among the team members")]),_v(", reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/testCaseDesign-printable.html b/se-book-adapted/chapters-printable/testCaseDesign-printable.html index b11224a26e..96b4cbcd14 100644 --- a/se-book-adapted/chapters-printable/testCaseDesign-printable.html +++ b/se-book-adapted/chapters-printable/testCaseDesign-printable.html @@ -23,7 +23,7 @@ [“F”]
    [“A”, “D”, “X”]

    No specific boundary
    No specific boundary
    -No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space

    Combining test inputs

    Why

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.

    Test Input Combination Strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.

    Heuristic: Each Valid Input at Least Once in a Positive Test Case

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    Heuristic: Test Invalid Inputs Individually Before Combining Them

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.

    Mix

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    More

    Testing Based on Use Cases

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space

    Combining test inputs

    Why

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.

    Test Input Combination Strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.

    Heuristic: Each Valid Input at Least Once in a Positive Test Case

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    Heuristic: Test Invalid Inputs Individually Before Combining Them

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.

    Mix

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    More

    Testing Based on Use Cases

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/testCaseDesign-printable.page-vue-render.js b/se-book-adapted/chapters-printable/testCaseDesign-printable.page-vue-render.js index 3aeba6aba4..97632b8c30 100644 --- a/se-book-adapted/chapters-printable/testCaseDesign-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/testCaseDesign-printable.page-vue-render.js @@ -131,6 +131,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"more"}},[_c('span',[_v("More") with(this){return _c('p',[_c('strong',[_v("Use cases can be used for system testing and acceptance testing")]),_v(". For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("user enters his personal data into the system")]),_v(". Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/testing-printable.html b/se-book-adapted/chapters-printable/testing-printable.html index ba97668ea3..50185b426a 100644 --- a/se-book-adapted/chapters-printable/testing-printable.html +++ b/se-book-adapted/chapters-printable/testing-printable.html @@ -771,7 +771,7 @@

    The number of paths through this method is very large, as each possible length of names produces a unique path.

    1. enter -> 2 -> exit (if names is empty)
    2. enter -> 2 -> 3 -> exit (if names has one entry)
    3. enter -> 2 -> 3 -> 2 -> 3 -> exit (if names has two entries) -1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    How

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)

    Dependency injection

    What

    Dependency injection is the process of 'injecting' objects to replace current dependencies with a different object. This is often used to inject stubs to isolate the from its so that it can be tested in isolation.

    A Foo object normally depends on a Bar object, but you can inject a BarStub object so that the Foo object no longer depends on a Bar object. Now you can test the Foo object in isolation from the Bar object.

    TDD

    What

    Test-Driven Development(TDD) advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments. In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +1 ...

    So, achieving 100% path coverage of this method will be extremely difficult.

    • Entry/exit coverage measures coverage in terms of possible calls to and exits from the operations in the SUT.
      Entry points refer to all places from which the method is called from the rest of the code i.e., all places where the control is handed over to the method in concern.
      Exit points refer to points at which the control is returned to the caller e.g., return statements, throwing of exceptions.

    How

    Measuring coverage is often done using coverage analysis tools. Most IDEs have inbuilt support for measuring test coverage, or at least have plugins that can measure test coverage.

    Coverage analysis can be useful in improving the quality of testing e.g., if a set of test cases does not achieve 100% branch coverage, more test cases can be added to cover missed branches.

    Measuring code coverage in IntelliJ IDEA (watch from 4 minutes 50 seconds mark)

    Dependency injection

    What

    Dependency injection is the process of 'injecting' objects to replace current dependencies with a different object. This is often used to inject stubs to isolate the from its so that it can be tested in isolation.

    A Foo object normally depends on a Bar object, but you can inject a BarStub object so that the Foo object no longer depends on a Bar object. Now you can test the Foo object in isolation from the Bar object.

    TDD

    What

    Test-Driven Development(TDD) advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments. In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/testing-printable.page-vue-render.js b/se-book-adapted/chapters-printable/testing-printable.page-vue-render.js index 79579a5a95..aae46dc22b 100644 --- a/se-book-adapted/chapters-printable/testing-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/testing-printable.page-vue-render.js @@ -224,6 +224,6 @@ with(this){return _c('div',[_c('h2',{attrs:{"id":"tdd"}},[_c('span',[_v("TDD")]) with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_c('strong',[_c('em',[_v("Test-Driven Development(TDD)")]),_v(" advocates writing the tests before writing the SUT, while evolving functionality and tests in small increments")]),_v(". In TDD you first define the precise behavior of the SUT using test code, and then update the SUT to match the specified behavior. While TDD has its fair share of detractors, there are many who consider it a good way to reduce defects. One big advantage of TDD is that it guarantees the code is testable.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters-printable/uml-printable.html b/se-book-adapted/chapters-printable/uml-printable.html index 6d3d2cb5c1..9c218f2302 100644 --- a/se-book-adapted/chapters-printable/uml-printable.html +++ b/se-book-adapted/chapters-printable/uml-printable.html @@ -529,7 +529,7 @@

    Alternative Paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.

    Optional Paths

    UML uses opt frames to indicate optional paths.

    Notation:

    Logic#markCellAt(...) calls Timer#start() only if it is the first move of the player.

    Parallel Paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.

    Reference Frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.

    Calls to Static Methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:

    Minimal Notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).

    Object diagrams

    Introduction

    An object diagram shows an object structure at a given point of time.

    An example object diagram:

    Objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:

    Associations

    A solid line indicates an association between two objects.

    An example object diagram showing two associations:

    Activity diagrams

    Introduction

    What

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]

    Basic notations

    Linear Paths

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:

    Alternate Paths

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:

    Parallel Paths

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.

    Rakes

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.

    Swimlanes

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:

    Notes

    Notes

    UML notes can augment UML diagrams with additional information. These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.

    Example:

    Miscellaneous

    Object vs Class Diagrams

    Compared to the notation for class diagrams, object diagrams differ in the following ways:

    • Show objects instead of classes:
      • Instance name may be shown
      • There is a : before the class name
      • Instance and class names are underlined
    • Methods are omitted
    • Multiplicities are omitted. Reason: an association line in an object diagram represents a connection to exactly one object (i.e., the multiplicity is always 1).

    Furthermore, multiple object diagrams can correspond to a single class diagram.

    Both object diagrams are derived from the same class diagram shown earlier. In other words, each of these object diagrams shows ‘an instance of’ the same class diagram.

    When the class diagram has an inheritance relationship, the object diagram should show either an object of the parent class or the child class, but not both.

    Suppose Employee is a child class of the Person class. The class diagram will be as follows:

    Now, how do you show an Employee object named jake?

    • This is not correct, as there should be only one object.

    • This is OK.

    • This is OK, as jake is a Person too. -That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters-printable/uml-printable.page-vue-render.js b/se-book-adapted/chapters-printable/uml-printable.page-vue-render.js index 08fe31f2a3..c7795bacda 100644 --- a/se-book-adapted/chapters-printable/uml-printable.page-vue-render.js +++ b/se-book-adapted/chapters-printable/uml-printable.page-vue-render.js @@ -254,6 +254,6 @@ with(this){return _c('p',[_v("When the class diagram has an inheritance relation with(this){return _c('p',[_c('strong',[_v("Association labels/roles "),_c('em',[_v("can")]),_v(" be omitted unless they add value")]),_v(" (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/architecture.html b/se-book-adapted/chapters/architecture.html index 25a63fd87c..8223892b37 100644 --- a/se-book-adapted/chapters/architecture.html +++ b/se-book-adapted/chapters/architecture.html @@ -16,7 +16,7 @@

    Software architecture

    Introduction

    What

    Can explain Software Architecture

    The software architecture of a program or computing system is the structure or structures of the system, which comprise software elements, the externally visible properties of those elements, and the relationships among them. Architecture is concerned with the public side of interfaces; private details of elements—details having to do solely with internal implementation—are not architectural. --- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture




    Architecture diagrams

    Reading

    Can interpret an architecture diagram

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:


    Drawing

    Can draw an architecture diagram

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.



    Architectural styles

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...



    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.



    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.



    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.



    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:


    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.



    More

    More Styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using Styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.





    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +-- Software Architecture in Practice (2nd edition), Bass, Clements, and Kazman

    The software architecture shows the overall organization of the system and can be viewed as a very high-level design. It usually consists of a set of interacting components that fit together to achieve the required functionality. It should be a simple and technically viable structure that is well-understood and agreed-upon by everyone in the development team, and it forms the basis for the implementation.

    A possible architecture for a Minesweeper game:

    Main components:

    • GUI: Graphical user interface
    • TextUi: Textual user interface
    • ATD: An automated test driver used for testing the game logic
    • Logic: Computation and logic of the game
    • Store: Storage and retrieval of game data (high scores etc.)

    The architecture is typically designed by the software architect, who provides the technical vision of the system and makes high-level (i.e. architecture-level) technical decisions about the project.


    Exercises:

    Statements about architecture




    Architecture diagrams

    Reading

    Can interpret an architecture diagram

    Architecture diagrams are free-form diagrams. There is no universally adopted standard notation for architecture diagrams. Any symbols that reasonably describe the architecture may be used.

    Some example architecture diagrams:


    Drawing

    Can draw an architecture diagram

    While architecture diagrams have no standard notation, try to follow these basic guidelines when drawing them.

    • Minimize the variety of symbols. If the symbols you choose do not have widely-understood meanings e.g. A drum symbol is widely-understood as representing a database, explain their meaning.

    • Avoid the indiscriminate use of double-headed arrows to show interactions between components.

    Consider the two architecture diagrams of the same software given below. Because Diagram 2 uses double-headed arrows, the important fact that GUI has a bidirectional dependency with the Logic component is no longer captured.



    Architectural styles

    Introduction

    What

    Can explain architectural styles

    Software architectures follow various high-level styles (aka architectural patterns), just like how building architectures follow various architecture styles.

    n-tier style, client-server style, event-driven style, transaction processing style, service-oriented style, pipes-and-filters style, message-driven style, broker style, ...



    N-tier architectural style

    What

    Can identify n-tier architectural style

    In the n-tier style, higher layers make use of services provided by lower layers. Lower layers are independent of higher layers. Other names: multi-layered, layered.

    Operating systems and network communication software often use n-tier style.



    Client-server architectural style

    What

    Can identify the client-server architectural style

    The client-server style has at least one component playing the role of a server and at least one client component accessing the services of the server. This is an architectural style used often in distributed applications.

    The online game and the web application below use the client-server style.



    Transaction processing architectural style

    What

    Can identify transaction processing architectural style

    The transaction processing style divides the workload of the system down to a number of transactions which are then given to a dispatcher that controls the execution of each transaction. Task queuing, ordering, undo etc. are handled by the dispatcher.

    In this example from a banking system, transactions are generated by the terminals used by , which are then sent to a central dispatching unit, which in turn dispatches the transactions to various other units to execute.



    Service-oriented architectural style

    What

    Can identify service-oriented architectural style

    The service-oriented architecture (SOA) style builds applications by combining functionalities packaged as programmatically accessible services. SOA aims to achieve interoperability between distributed services, which may not even be implemented using the same programming language. A common way to implement SOA is through the use of XML web services where the web is used as the medium for the services to interact, and XML is used as the language of communication between service providers and service users.

    Suppose that Amazon.com provides a web service for customers to browse and buy merchandise, while HSBC provides a web service for merchants to charge HSBC credit cards. Using these web services, an ‘eBookShop’ web application can be developed that allows HSBC customers to buy merchandise from Amazon and pay for them using HSBC credit cards. Because both Amazon and HSBC services follow the SOA architecture, their web services can be reused by the web application, even if all three systems use different programming platforms.


    Resources:


    Event-driven architectural style

    What

    Can identify event-driven architectural style

    Event-driven style controls the flow of the application by detecting from event emitters and communicating those events to interested event consumers. This architectural style is often used in GUIs.

    When the ‘button clicked’ event occurs in a GUI, that event can be transmitted to components that are interested in reacting to that event. Similarly, events detected at a printer port can be transmitted to components related to operating the printer. The same event can be sent to multiple consumers too.



    More

    More Styles

    Can name several other architecture styles

    Other well-known architectural styles include the pipes-and-filters architecture, the broker architecture, the peer-to-peer architecture, and the message-oriented architecture.


    Resources:

    Using Styles

    Can explain how architectural styles are combined

    Most applications use a mix of these architectural styles.

    An application can use a client-server architecture where the server component comprises several layers, i.e. it uses the n-tier architecture.


    Exercises:

    Comment on how to use architecture styles in Minesweeper.





    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/architecture.page-vue-render.js b/se-book-adapted/chapters/architecture.page-vue-render.js index 52a4eeea3e..f00dd1cd48 100644 --- a/se-book-adapted/chapters/architecture.page-vue-render.js +++ b/se-book-adapted/chapters/architecture.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"software-architecture"}},[_c('span',[_v("Software architecture")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-architecture","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/codeQuality.html b/se-book-adapted/chapters/codeQuality.html index 7b065ab483..d97b930515 100644 --- a/se-book-adapted/chapters/codeQuality.html +++ b/se-book-adapted/chapters/codeQuality.html @@ -1758,7 +1758,7 @@ -



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/codeQuality.page-vue-render.js b/se-book-adapted/chapters/codeQuality.page-vue-render.js index 96de0225fe..09867ffa5c 100644 --- a/se-book-adapted/chapters/codeQuality.page-vue-render.js +++ b/se-book-adapted/chapters/codeQuality.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"code-quality"}},[_c('span',[_v("Code quality")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#code-quality","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/cppToJava.html b/se-book-adapted/chapters/cppToJava.html index 324b0ef8cd..3b969402dc 100644 --- a/se-book-adapted/chapters/cppToJava.html +++ b/se-book-adapted/chapters/cppToJava.html @@ -10477,7 +10477,7 @@ -

    Resources:


    Streams

    : Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds




    JavaFX

    Can use JavaFX to build a simple GUI

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:


    Streams

    : Can use Java8 streams

    Java 8 introduced a number of new features (e.g. Lambdas, Streams) that are not trivial to learn but also extremely useful to know.

    Here is an overview of new Java 8 features (written by Benjamin Winterberg).


    Resources:

    Tutorials:


    A video tutorial by well-known Java coach Venkat Subramaniam

    A a more detailed version covering similar grounds




    JavaFX

    Can use JavaFX to build a simple GUI

    JavaFX is a technology for building Java-based GUIs. Previously it was a part of Java itself, but has become a third-party dependency since then. It is now being maintained by OpenJDK.

    Refer to the JavaFX tutorial @SE-EDU/guides to learn how to get started with JavaFX.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/cppToJava.page-vue-render.js b/se-book-adapted/chapters/cppToJava.page-vue-render.js index 7e5b43422a..6145c062fb 100644 --- a/se-book-adapted/chapters/cppToJava.page-vue-render.js +++ b/se-book-adapted/chapters/cppToJava.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"c-to-java"}},[_c('span',[_v("C++ to Java")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#c-to-java","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/design.html b/se-book-adapted/chapters/design.html index 764a31efa7..187ce59989 100644 --- a/se-book-adapted/chapters/design.html +++ b/se-book-adapted/chapters/design.html @@ -15,7 +15,7 @@

    Software design

    Introduction

    What

    Can explain what is software design

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Software design

    Introduction

    What

    Can explain what is software design

    Design is the creative process of transforming the problem into a solution; the solution is also called design. -- 📖 Software Engineering Theory and Practice, Shari Lawrence; Atlee, Joanne M. Pfleeger

    Software design has two main aspects:

    • Product/external design: designing the external behavior of the product to meet the users' requirements. This is usually done by product designers with input from business analysts, user experience experts, user representatives, etc.
    • Implementation/internal design: designing how the product will be implemented to meet the required external behavior. This is usually done by software architects and software engineers.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/design.page-vue-render.js b/se-book-adapted/chapters/design.page-vue-render.js index 721267c128..15d2c6f3e4 100644 --- a/se-book-adapted/chapters/design.page-vue-render.js +++ b/se-book-adapted/chapters/design.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"software-design"}},[_c('span',[_v("Software design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-design","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/designApproaches.html b/se-book-adapted/chapters/designApproaches.html index 482860fe50..d6093a7dac 100644 --- a/se-book-adapted/chapters/designApproaches.html +++ b/se-book-adapted/chapters/designApproaches.html @@ -15,7 +15,7 @@

    Design approaches

    Multi-level design

    What

    Can explain multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:






    Top-down and bottom-up design

    What

    Can explain top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?




    Agile design

    What

    Can explain agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design approaches

    Multi-level design

    What

    Can explain multi-level design

    In a smaller system, the design of the entire system can be shown in one place.

    This class diagram of se-edu/addressbook-level2 depicts the design of the entire software.

    The design of bigger systems needs to be done/shown at multiple levels.

    This architecture diagram of se-edu/addressbook-level3 depicts the high-level design of the software.

    Here are examples of lower level designs of some components of the same software:






    Top-down and bottom-up design

    What

    Can explain top-down and bottom-up design

    Multi-level design can be done in a top-down manner, bottom-up manner, or as a mix.

    • Top-down: Design the high-level design first and flesh out the lower levels later. This is especially useful when designing big and novel systems where the high-level design needs to be stable before lower levels can be designed.
    • Bottom-up: Design lower level components first and put them together to create the higher-level systems later. This is not usually scalable for bigger systems. One instance where this approach might work is when designing a variation of an existing system or re-purposing existing components to build a new system.
    • Mix: Design the top levels using the top-down approach but switch to a bottom-up approach when designing the bottom levels.

    Exercises:

    Which is better?




    Agile design

    What

    Can explain agile design

    Agile design can be contrasted with full upfront design in the following way:

    Agile designs are emergent, they’re not defined up front. Your overall system design will emerge over time, evolving to fulfill new requirements and take advantage of new technologies as appropriate. Although you will often do some initial architectural modeling at the very beginning of a project, this will be just enough to get your team going. This approach does not produce a fully documented set of models in place before you may begin coding. -- adapted from agilemodeling.com


    Exercises:

    Statement about agile design




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/designApproaches.page-vue-render.js b/se-book-adapted/chapters/designApproaches.page-vue-render.js index 2bc344d1bc..cec094ecc6 100644 --- a/se-book-adapted/chapters/designApproaches.page-vue-render.js +++ b/se-book-adapted/chapters/designApproaches.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"design-approaches"}},[_c('span',[_v("Design approaches")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design-approaches","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/designFundamentals.html b/se-book-adapted/chapters/designFundamentals.html index db893523cf..aee525a329 100644 --- a/se-book-adapted/chapters/designFundamentals.html +++ b/se-book-adapted/chapters/designFundamentals.html @@ -15,7 +15,7 @@

    Design fundamentals

    Abstraction

    What

    Can explain abstraction

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.


    Coupling

    What

    Can explain coupling

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling



    How

    Can reduce coupling

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?



    Types of Coupling

    Can identify types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other


    Cohesion

    What

    Can explain cohesion

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Can increase cohesion

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Design fundamentals

    Abstraction

    What

    Can explain abstraction

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    The guiding principle of abstraction is that only details that are relevant to the current perspective or the task at hand need to be considered. As most programs are written to solve complex problems involving large amounts of intricate details, it is impossible to deal with all these details at the same time. That is where abstraction can help.

    Data abstraction: abstracting away the lower level data items and thinking in terms of bigger entities

    Within a certain software component, you might deal with a user data type, while ignoring the details contained in the user data item such as name, and date of birth. These details have been ‘abstracted away’ as they do not affect the task of that software component.

    Control abstraction: abstracting away details of the actual control flow to focus on tasks at a higher level

    print(“Hello”) is an abstraction of the actual output mechanism within the computer.

    Abstraction can be applied repeatedly to obtain progressively higher levels of abstraction.

    An example of different levels of data abstraction: a File is a data item that is at a higher level than an array and an array is at a higher level than a bit.

    An example of different levels of control abstraction: execute(Game) is at a higher level than print(Char) which is at a higher level than an Assembly language instruction MOV.

    Abstraction is a general concept that is not limited to just data or control abstractions.

    Some more general examples of abstraction:

    • An OOP class is an abstraction over related data and behaviors.
    • An architecture is a higher-level abstraction of the design of a software.
    • Models (e.g., UML models) are abstractions of some aspect of reality.


    Coupling

    What

    Can explain coupling

    Coupling is a measure of the degree of dependence between components, classes, methods, etc. Low coupling indicates that a component is less dependent on other components. High coupling (aka tight coupling or strong coupling) is discouraged due to the following disadvantages:

    • Maintenance is harder because a change in one module could cause changes in other modules coupled to it (i.e. a ripple effect).
    • Integration is harder because multiple components coupled with each other have to be integrated at the same time.
    • Testing and reuse of the module is harder due to its dependence on other modules.

    In the example below, design A appears to have more coupling between the components than design B.


    Exercises:

    Coupling levels of alternative designs


    Regressions and coupling


    Coupling and testability


    Statements about coupling



    How

    Can reduce coupling

    X is coupled to Y if a change to Y can potentially require a change in X.

    If the Foo class calls the method Bar#read(), Foo is coupled to Bar because a change to Bar can potentially (but not always) require a change in the Foo class e.g. if the signature of Bar#read() is changed, Foo needs to change as well, but a change to the Bar#write() method may not require a change in the Foo class because Foo does not call Bar#write().

    code for the above example


    Some examples of coupling: A is coupled to B if,

    • A has access to the internal structure of B (this results in a very high level of coupling)
    • A and B depend on the same global variable
    • A calls B
    • A receives an object of B as a parameter or a return value
    • A inherits from B
    • A and B are required to follow the same data format or communication protocol

    Exercises:

    Which indicate coupling?



    Types of Coupling

    Can identify types of coupling

    Some examples of different coupling types:

    • Content coupling: one module modifies or relies on the internal workings of another module e.g., accessing local data of another module
    • Common/Global coupling: two modules share the same global data
    • Control coupling: one module controlling the flow of another, by passing it information on what to do e.g., passing a flag
    • Data coupling: one module sharing data with another module e.g. via passing parameters
    • External coupling: two modules share an externally imposed convention e.g., data formats, communication protocols, device interfaces.
    • Subclass coupling: a class inherits from another class. Note that a child class is coupled to the parent class but not the other way around.
    • Temporal coupling: two actions are bundled together just because they happen to occur at the same time e.g. extracting a contiguous block of code as a method although the code block contains statements unrelated to each other


    Cohesion

    What

    Can explain cohesion

    Cohesion is a measure of how strongly-related and focused the various responsibilities of a component are. A highly-cohesive component keeps related functionalities together while keeping out all other unrelated things.

    Higher cohesion is better. Disadvantages of low cohesion (aka weak cohesion):

    • Lowers the understandability of modules as it is difficult to express module functionalities at a higher level.
    • Lowers maintainability because a module can be modified due to unrelated causes (reason: the module contains code unrelated to each other) or many modules may need to be modified to achieve a small change in behavior (reason: because the code related to that change is not localized to a single module).
    • Lowers reusability of modules because they do not represent logical units of functionality.

    How

    Can increase cohesion

    Cohesion can be present in many forms. Some examples:

    • Code related to a single concept is kept together, e.g. the Student component handles everything related to students.
    • Code that is invoked close together in time is kept together, e.g. all code related to initializing the system is kept together.
    • Code that manipulates the same data structure is kept together, e.g. the GameArchive component handles everything related to the storage and retrieval of game sessions.

    Suppose a Payroll application contains a class that deals with writing data to the database. If the class includes some code to show an error dialog to the user if the database is unreachable, that class is not cohesive because it seems to be interacting with the user as well as the database.


    Exercises:

    Which class is more cohesive?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/designFundamentals.page-vue-render.js b/se-book-adapted/chapters/designFundamentals.page-vue-render.js index 1d82cf0cc7..233ccebd8a 100644 --- a/se-book-adapted/chapters/designFundamentals.page-vue-render.js +++ b/se-book-adapted/chapters/designFundamentals.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"design-fundamentals"}},[_c('span',[_v("Design fundamentals")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#design-fundamentals","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/designPatterns.html b/se-book-adapted/chapters/designPatterns.html index 537acb9e43..d7f91f2ae9 100644 --- a/se-book-adapted/chapters/designPatterns.html +++ b/se-book-adapted/chapters/designPatterns.html @@ -337,7 +337,7 @@
    • Chain of Responsibility, Command, Interpreter, Template Method, Iterator, Mediator, Memento, Observer, State, Strategy, Visitor

    Using Design Patterns

    Can explain pros and cons of design patterns

    Design patterns provide a high-level vocabulary to talk about design.

    Someone can say 'apply Observer pattern here' instead of having to describe the mechanics of the solution in detail.

    Knowing more patterns is a way to become more ‘experienced’. Aim to learn at least the context and the problem of patterns so that when you encounter those problems you know where to look for a solution.

    Some patterns are domain-specific e.g. patterns for distributed applications, some are created in-house e.g. patterns in the company/project and some can be self-created e.g. from past experience.

    Be careful not to overuse patterns. Do not throw patterns at a problem at every opportunity. Patterns come with overhead such as adding more classes or increasing the levels of abstraction. Use them only when they are needed. Before applying a pattern, make sure that:

    • there is substantial improvement in the design, not just superficial.
    • the associated tradeoffs are carefully considered. There are times when a design pattern is not appropriate (or an overkill).

    Other Types of Patterns

    Can explain how patterns exist beyond the domain of software design

    The notion of capturing design ideas as "patterns" is usually attributed to Christopher Alexander. He is a building architect noted for his theories about design. His book The Timeless Way of Building talks about "design patterns" for constructing buildings.

    Here is a sample pattern from that book:

    When a room has a window with a view, the window becomes a focal point: people are attracted to the window and want to look through it. The furniture in the room creates a second focal point: everyone is attracted toward whatever point the furniture aims them at (usually the center of the room or a TV). This makes people feel uncomfortable. They want to look out the window, and toward the other focus at the same time. If you rearrange the furniture, so that its focal point becomes the window, then everyone will suddenly notice that the -room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain



    Design Patterns vs Design Principles

    Can differentiate between design patterns and principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +room is much more “comfortable”.

    Apparently, patterns and anti-patterns are found in the field of building architecture. This is because they are general concepts applicable to any domain, not just software design. In software engineering, there are many general types of patterns: Analysis patterns, Design patterns, Testing patterns, Architectural patterns, Project management patterns, and so on.

    In fact, the abstraction occurrence pattern is more of an analysis pattern than a design pattern, while MVC is more of an architectural pattern.

    New patterns can be created too. If a common problem that needs to be solved frequently leads to a non-obvious and better solution, it can be formulated as a pattern so that it can be reused by others. However, don’t reinvent the wheel; the pattern might already exist.


    Exercises:

    Give a pattern from another domain



    Design Patterns vs Design Principles

    Can differentiate between design patterns and principles

    Design principles have varying degrees of formality – rules, opinions, rules of thumb, observations, and axioms. Compared to design patterns, principles are more general, have wider applicability, with correspondingly greater overlap among them.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/designPatterns.page-vue-render.js b/se-book-adapted/chapters/designPatterns.page-vue-render.js index fb6e2a7333..fb29ff0c23 100644 --- a/se-book-adapted/chapters/designPatterns.page-vue-render.js +++ b/se-book-adapted/chapters/designPatterns.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"software-design-patterns"}},[_c('span',[_v("Software design patterns")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-design-patterns","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/documentation.html b/se-book-adapted/chapters/documentation.html index db44699043..d428c38fa1 100644 --- a/se-book-adapted/chapters/documentation.html +++ b/se-book-adapted/chapters/documentation.html @@ -175,7 +175,7 @@ -

    Resources:



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Resources:



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/documentation.page-vue-render.js b/se-book-adapted/chapters/documentation.page-vue-render.js index b5f7c9b312..16784b1f80 100644 --- a/se-book-adapted/chapters/documentation.page-vue-render.js +++ b/se-book-adapted/chapters/documentation.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"documentation"}},[_c('span',[_v("Documentation")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#documentation","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/errorHandling.html b/se-book-adapted/chapters/errorHandling.html index 8871a09385..3b9684a569 100644 --- a/se-book-adapted/chapters/errorHandling.html +++ b/se-book-adapted/chapters/errorHandling.html @@ -825,7 +825,7 @@ -

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?



    When

    Can explain when to use defensive programming

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming




    Design-by-contract approach

    Design by Contract

    Can explain the Design-by-Contract approach

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    When james.setGirlfriend(jean) is executed, the code ensures that james breaks up with any current girlfriend before he accepts jean as his girlfriend. Furthermore, the code ensures that jean breaks up with any existing boyfriends before accepting james as her boyfriend.


    Exercises:

    Implement Player and Region


    Bidirectional association between Bank and Account


    Is the code defensive? Teacher and Student


    True or False?



    When

    Can explain when to use defensive programming

    It is not necessary to be 100% defensive all the time. While defensive code may be less prone to be misused or abused, such code can also be more complicated and slower to run.

    The suitable degree of defensiveness depends on many factors such as:

    • How critical is the system?
    • Will the code be used by programmers other than the author?
    • The level of programming language support for defensive programming
    • The overhead of being defensive

    Exercises:

    Defensive programming




    Design-by-contract approach

    Design by Contract

    Can explain the Design-by-Contract approach

    is an approach for designing software that requires defining formal, precise and verifiable interface specifications for software components.

    Suppose an operation is implemented with the behavior specified precisely in the API (preconditions, post conditions, exceptions etc.). When following the defensive approach, the code should first check if the preconditions have been met. Typically, exceptions are thrown if preconditions are violated. In contrast, the Design-by-Contract (DbC) approach to coding assumes that it is the responsibility of the caller to ensure all preconditions are met. The operation will honor the contract only if the preconditions have been met. If any of them have not been met, the behavior of the operation is "unspecified".

    Languages such as Eiffel have native support for DbC. For example, preconditions of an operation can be specified in Eiffel and the language runtime will check precondition violations without the need to do it explicitly in the code. To follow the DbC approach in languages such as Java and C++ where there is no built-in DbC support, assertions can be used to confirm pre-conditions.


    Exercises:

    Statements about the Design-by-contract approach




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/errorHandling.page-vue-render.js b/se-book-adapted/chapters/errorHandling.page-vue-render.js index ac08f6bcfb..8b42795315 100644 --- a/se-book-adapted/chapters/errorHandling.page-vue-render.js +++ b/se-book-adapted/chapters/errorHandling.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"error-handling"}},[_c('span',[_v("Error handling")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#error-handling","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/gatheringRequirements.html b/se-book-adapted/chapters/gatheringRequirements.html index cb5305a08f..c27f03cfba 100644 --- a/se-book-adapted/chapters/gatheringRequirements.html +++ b/se-book-adapted/chapters/gatheringRequirements.html @@ -15,7 +15,7 @@

    Gathering requirements

    Brainstorming

    Can explain brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.


    Exercises:

    Characteristic of brainstorming



    User Surveys

    Can explain user surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.


    Observation

    Can explain observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.


    Interviews

    Can explain interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.


    Focus Groups

    Can explain focus groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra


    Prototyping

    Can explain prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.


    Product Surveys

    Can explain product surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Gathering requirements

    Brainstorming

    Can explain brainstorming

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    In a brainstorming session there are no "bad" ideas. The aim is to generate ideas; not to validate them. Brainstorming encourages you to "think outside the box" and put "crazy" ideas on the table without fear of rejection.


    Exercises:

    Characteristic of brainstorming



    User Surveys

    Can explain user surveys

    Surveys can be used to solicit responses and opinions from a large number of stakeholders regarding a current product or a new product.


    Observation

    Can explain observation

    Observing users in their natural work environment can uncover product requirements. Usage data of an existing system can also be used to gather information about how an existing system is being used, which can help in building a better replacement e.g. to find the situations where the user makes mistakes when using the current system.


    Interviews

    Can explain interviews

    Interviewing stakeholders and domain experts can produce useful information about project requirements.


    Focus Groups

    Can explain focus groups

    Focus groups are a kind of informal interview within an interactive group setting. A group of people (e.g. potential users, beta testers) are asked about their understanding of a specific issue, process, product, advertisement, etc.

    : How do focus groups work? - Hector Lanz extra


    Prototyping

    Can explain prototyping

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Prototyping can uncover requirements, in particular, those related to how users interact with the system. UI prototypes or mock ups are often used in brainstorming sessions, or in meetings with the users to get quick feedback from them.

    A mock up (also called a wireframe diagram) of a dialog box:


    [source: plantuml.com]

    Prototyping can be used for discovering as well as specifying requirements e.g. a UI prototype can serve as a specification of what to build.


    Product Surveys

    Can explain product surveys

    Studying existing products can unearth shortcomings of existing solutions that can be addressed by a new product. Product manuals and other forms of documentation of an existing system can tell us how the existing solutions work.

    When developing a game for a mobile device, a look at a similar PC game can give insight into the kind of features and interactions the mobile game can offer.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/gatheringRequirements.page-vue-render.js b/se-book-adapted/chapters/gatheringRequirements.page-vue-render.js index d48d9b93c8..2d9fc20856 100644 --- a/se-book-adapted/chapters/gatheringRequirements.page-vue-render.js +++ b/se-book-adapted/chapters/gatheringRequirements.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"gathering-requirements"}},[_c('span',[_v("Gathering requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#gathering-requirements","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/gitAndGithub.html b/se-book-adapted/chapters/gitAndGithub.html index e2d15137cd..1244373b65 100644 --- a/se-book-adapted/chapters/gitAndGithub.html +++ b/se-book-adapted/chapters/gitAndGithub.html @@ -2033,7 +2033,7 @@ (1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo.
    If there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new master branch to each of them.
    (2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.
  • Some alternatives mechanisms to achieve the same can be found in this GitHub help page.
    -If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.
  • Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.

    Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/gitAndGithub.page-vue-render.js b/se-book-adapted/chapters/gitAndGithub.page-vue-render.js index 8466439422..def212ba12 100644 --- a/se-book-adapted/chapters/gitAndGithub.page-vue-render.js +++ b/se-book-adapted/chapters/gitAndGithub.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"git-and-github"}},[_c('span',[_v("Git and GitHub")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#git-and-github","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/ides.html b/se-book-adapted/chapters/ides.html index 0f88f61bb8..f4cf7db355 100644 --- a/se-book-adapted/chapters/ides.html +++ b/se-book-adapted/chapters/ides.html @@ -17,7 +17,7 @@

    IDEs

    Introduction

    What

    Can explain IDEs

    Professional software engineers often write code using Integrated Development Environments (IDEs). IDEs support most development-related work within the same tool (hence, the term integrated).

    An IDE generally consists of:

    • A source code editor that includes features such as syntax coloring, auto-completion, easy code navigation, error highlighting, and code-snippet generation.
    • A compiler and/or an interpreter (together with other build automation support) that facilitates the compilation/linking/running/deployment of a program.
    • A debugger that allows the developer to execute the program one step at a time to observe the run-time behavior in order to locate bugs.
    • Other tools that aid various aspects of coding e.g. support for automated testing, drag-and-drop construction of UI components, version management support, simulation of the target runtime platform, modeling support, AI-assisted coding help, collaborative coding with others.

    Examples of popular IDEs:

    • Java: Eclipse, IntelliJ IDEA, NetBeans
    • C#, C++: Visual Studio
    • Swift: XCode
    • Python: PyCharm
    • Multiple languages: VS Code

    Some web-based IDEs have appeared in recent times too e.g., Amazon's Cloud9 IDE.

    Some experienced developers, in particular those with a UNIX background, prefer lightweight yet powerful text editors with scripting capabilities (e.g. Emacs) over heavier IDEs.


    Exercises:

    Which of these are features available in IDEs?




    Debugging

    What

    Can explain debugging

    Debugging is the process of discovering defects in the program. Here are some approaches to debugging:

    • Bad -- By inserting temporary print statements: This is an ad-hoc approach in which print statements are inserted in the program to print information relevant to debugging, such as variable values. e.g. Exiting process() method, x is 5.347. This approach is not recommended due to these reasons:
      • Incurs extra effort when inserting and removing the print statements.
      • These extraneous program modifications increase the risk of introducing errors into the program.
      • These print statements, if not removed promptly after the debugging, may even appear unexpectedly in the production version.
    • Bad -- By manually tracing through the code: Otherwise known as ‘eye-balling’, this approach doesn't have the cons of the previous approach, but it too is not recommended (other than as a 'quick try') due to these reasons: -
      • It is a difficult, time consuming, and error-prone technique.
      • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
    • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • It is a difficult, time consuming, and error-prone technique.
    • If you didn't spot the error while writing the code, you might not spot the error when reading the code either.
  • Good -- Using a debugger: A debugger tool allows you to pause the execution, then step through the code one statement at a time while examining the internal state if necessary. Most IDEs come with an inbuilt debugger. This is the recommended approach for debugging.


  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/ides.page-vue-render.js b/se-book-adapted/chapters/ides.page-vue-render.js index bd247d4183..60d530729d 100644 --- a/se-book-adapted/chapters/ides.page-vue-render.js +++ b/se-book-adapted/chapters/ides.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"ides"}},[_c('span',[_v("IDEs")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ides","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/integration.html b/se-book-adapted/chapters/integration.html index 4b8b9138e6..49e31e7fa9 100644 --- a/se-book-adapted/chapters/integration.html +++ b/se-book-adapted/chapters/integration.html @@ -15,7 +15,7 @@

    Integration

    Introduction

    What

    Can explain integration

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.



    Approaches

    'Late and One Time' vs 'Early and Frequent'

    Can explain how integration approaches vary based on timing and frequency

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:


    Big-Bang vs Incremental Integration

    Can explain how integration approaches vary based on amount merged at a time

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects



    Top-Down vs Bottom-Up Integration

    Can explain how integration approaches vary based on the order of integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order




    Build Automation

    What

    Can explain build automation tools

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.


    Continuous Integration and Continuous Deployment

    Can explain continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Integration

    Introduction

    What

    Can explain integration

    Combining parts of a software product to form a whole is called integration. It is also one of the most troublesome tasks and it rarely goes smoothly.



    Approaches

    'Late and One Time' vs 'Early and Frequent'

    Can explain how integration approaches vary based on timing and frequency

    In terms of timing and frequency, there are two general approaches to integration: late and one-time, early and frequent.

    Late and one-time: wait till all components are completed and integrate all finished components near the end of the project.

    This approach is not recommended because integration often causes many component incompatibilities (due to previous miscommunications and misunderstandings) to surface which can lead to delivery delays i.e. Late integration → incompatibilities found → major rework required → cannot meet the delivery date.

    Early and frequent: integrate early and evolve each part in parallel, in small steps, re-integrating frequently.

    A can be written first. This can be done by one developer, possibly the one in charge of integration. After that, all developers can flesh out the skeleton in parallel, adding one feature at a time. After each feature is done, simply integrate the new code into the main system.

    Here is an animation that compares the two approaches:


    Big-Bang vs Incremental Integration

    Can explain how integration approaches vary based on amount merged at a time

    Big-bang integration: integrate all (or too many) components at the same time. More generally, integrating too many changes at the same time.

    Big-bang is not recommended because it will uncover too many problems at the same time which could make debugging and bug-fixing more complex than when problems are uncovered incrementally.

    Incremental integration: integrate a few components at a time. More generally, integrating changes gradually. This approach is better than big-bang integration because it surfaces integration problems in a more manageable way.

    Here is an animation that compares the two approaches:


    Exercises:

    Big-bang integration in school projects



    Top-Down vs Bottom-Up Integration

    Can explain how integration approaches vary based on the order of integration

    Based on the order in which components are integrated, incremental integration can be done in three ways.

    Top-down integration: higher-level components are integrated before bringing in the lower-level components. One advantage of this approach is that higher-level problems can be discovered early. One disadvantage is that this requires the use of stubs in place of lower level components until the real lower-level components are integrated into the system. Otherwise, higher-level components cannot function as they depend on lower level ones.

    Bottom-up integration: the reverse of top-down integration. Note that when integrating lower level components, may be needed to test the integrated components because the UI may not be integrated yet, just like how top-down integration needs stubs.

    Sandwich integration: a mix of the top-down and bottom-up approaches. The idea is to do both top-down and bottom-up so as to 'meet' in the middle.

    Here is an animation that compares the three approaches:


    Exercises:

    Suggest an integration strategy


    Integration order




    Build Automation

    What

    Can explain build automation tools

    Build automation tools automate the steps of the build process, usually by means of build scripts.

    In a non-trivial project, building a product from its source code can be a complex multi-step process. For example, it can include steps such as: pull code from the revision control system, compile, link, run automated tests, automatically update release documents (e.g. build number), package into a distributable, push to repo, deploy to a server, delete temporary files created during building/testing, email developers of the new build, and so on. Furthermore, this build process can be done ‘on demand’, it can be scheduled (e.g. every day at midnight) or it can be triggered by various events (e.g. triggered by a code push to the revision control system).

    Some of these build steps such as compiling, linking and packaging, are already automated in most modern IDEs. For example, several steps happen automatically when the ‘build’ button of the IDE is clicked. Some IDEs even allow customization of this build process to some extent.

    However, most big projects use specialized build tools to automate complex build processes.

    Some popular build tools relevant to Java developers: Gradle, Maven, Apache Ant, GNU Make

    Some other build tools: Grunt (JavaScript), Rake (Ruby)

    Some build tools also serve as dependency management tools. Modern software projects often depend on third party libraries that evolve constantly. That means developers need to download the correct version of the required libraries and update them regularly. Therefore, dependency management is an important part of build automation. Dependency management tools can automate that aspect of a project.

    Maven and Gradle, in addition to managing the build process, can play the role of dependency management tools too.


    Continuous Integration and Continuous Deployment

    Can explain continuous integration and continuous deployment

    An extreme application of build automation is called continuous integration (CI) in which integration, building, and testing happens automatically after each code change.

    A natural extension of CI is Continuous Deployment (CD) where the changes are not only integrated continuously, but also deployed to end-users at the same time.

    Some examples of CI/CD tools: Travis, Jenkins, Appveyor, CircleCI, GitHub Actions



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/integration.page-vue-render.js b/se-book-adapted/chapters/integration.page-vue-render.js index 3961067a15..2580f73bba 100644 --- a/se-book-adapted/chapters/integration.page-vue-render.js +++ b/se-book-adapted/chapters/integration.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"integration"}},[_c('span',[_v("Integration")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#integration","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/intellij.html b/se-book-adapted/chapters/intellij.html index 4f0a236965..1a48a24190 100644 --- a/se-book-adapted/chapters/intellij.html +++ b/se-book-adapted/chapters/intellij.html @@ -15,7 +15,7 @@

    IntelliJ IDEA

    Project Setup

    Can setup a project in an IDE

    Running IntelliJ IDEA for the First Time

    A slightly more detailed explanation (from CodeLaunch) with some additional info at the end.




    Code Navigation

    Can navigate code effectively using IDE features

    Some useful navigation shortcuts:

    1. Quickly locate a file by name.
    2. Go to the definition of a method from where it is used.
    3. Go back to the previous location.
    4. View the documentation of a method from where the method is being used, without navigating to the method itself.
    5. Find where a method/field is being used.

    IntelliJ IDEA Code Navigation



    Productivity Shortcuts

    Can use some useful IDE productivity shortcuts


    Debugging: Basic

    Can step through a program using a debugger

    This video (from LaunchCode) gives a pretty good explanation of how to use the IntelliJ IDEA debugger.


    Refactoring

    Can use automated refactoring features of the IDE

    This video explains how to automate the 'Extract variable' refactoring using IntelliJ IDEA. Most other refactorings available work similarly. i.e. select the code to refactorfind the refactoring in the context menu or use the keyboard shortcut.

    Here's another video explaining how to do some more useful refactorings in IntelliJ IDEA.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    IntelliJ IDEA

    Project Setup

    Can setup a project in an IDE

    Running IntelliJ IDEA for the First Time

    A slightly more detailed explanation (from CodeLaunch) with some additional info at the end.




    Code Navigation

    Can navigate code effectively using IDE features

    Some useful navigation shortcuts:

    1. Quickly locate a file by name.
    2. Go to the definition of a method from where it is used.
    3. Go back to the previous location.
    4. View the documentation of a method from where the method is being used, without navigating to the method itself.
    5. Find where a method/field is being used.

    IntelliJ IDEA Code Navigation



    Productivity Shortcuts

    Can use some useful IDE productivity shortcuts


    Debugging: Basic

    Can step through a program using a debugger

    This video (from LaunchCode) gives a pretty good explanation of how to use the IntelliJ IDEA debugger.


    Refactoring

    Can use automated refactoring features of the IDE

    This video explains how to automate the 'Extract variable' refactoring using IntelliJ IDEA. Most other refactorings available work similarly. i.e. select the code to refactorfind the refactoring in the context menu or use the keyboard shortcut.

    Here's another video explaining how to do some more useful refactorings in IntelliJ IDEA.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/intellij.page-vue-render.js b/se-book-adapted/chapters/intellij.page-vue-render.js index 386fb80967..5949d4cf90 100644 --- a/se-book-adapted/chapters/intellij.page-vue-render.js +++ b/se-book-adapted/chapters/intellij.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"intellij-idea"}},[_c('span',[_v("IntelliJ IDEA")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#intellij-idea","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/modeling.html b/se-book-adapted/chapters/modeling.html index ab9c0b0efd..f722746dec 100644 --- a/se-book-adapted/chapters/modeling.html +++ b/se-book-adapted/chapters/modeling.html @@ -117,7 +117,7 @@

    UML: Sequence Diagrams: Reference Frames

    Loading...


    Use Case Diagrams

    Can explain use case diagrams

    Use case diagrams model the mapping between features of a system and its user roles i.e., which user roles can perform which tasks using the software.

    A simple use case diagram:


    Timing Diagrams

    Can explain timing diagrams

    A timing diagram focuses on timing constraints.

    Here is an example timing diagram:


    Adapted from: UML Distilled by Martin Fowler


    Interaction Overview Diagrams

    Can explain interaction overview diagrams

    Interaction overview diagrams are a combination of activity diagrams and sequence diagrams.

    An example:

    source: https://commons.wikimedia.org


    Communication Diagrams

    Can explain communication diagrams

    Communication diagrams are like sequence diagrams but emphasize the data links between the various participants in the interaction rather than the sequence of interactions.

    An example:


    Adapted from: UML Distilled by Martin Fowler


    State Machine Diagrams

    Can explain state machine diagrams

    A State Machine Diagram models state-dependent behavior.

    Consider how a CD player responds when the “eject CD” button is pushed:

    • If the CD tray is already open, it does nothing.
    • If the CD tray is already in the process of opening (opened half-way), it continues to open the CD tray.
    • If the CD tray is closed and the CD is being played, it stops playing and opens the CD tray.
    • If the CD tray is closed and CD is not being played, it simply opens the CD tray.
    • If the CD tray is already in the process of closing (closed half-way), it waits until the CD tray is fully closed and opens it immediately afterwards.

    What this means is that the CD player’s response to pushing the “eject CD” button depends on what it was doing at the time of the event. More generally, the CD player’s response to the event received depends on its internal state. Such a behavior is called a state-dependent behavior.

    Often, state-dependent behavior displayed by an object in a system is simple enough that it needs no extra attention; such a behavior can be as simple as a conditional behavior like if x > y, then x = x - y.

    Occasionally, objects may exhibit state-dependent behavior that is complex enough such that it needs to be captured in a separate model. Such state-dependent behavior can be modeled using UML state machine diagrams (SMD for short, sometimes also called ‘state charts’, ‘state diagrams’ or ‘state machines’).

    An SMD views the life-cycle of an object as consisting of a finite number of states where each state displays a unique behavior pattern. SMDs capture information such as the states an object can be in during its lifetime, how the object responds to various events while in each state, and how the object transits from one state to another. In contrast to sequence diagrams that capture object behavior one scenario at a time, SMDs capture the object’s behavior over its full life-cycle.

    An SMD for the Minesweeper game.



    Modeling a solution

    Introduction

    Can explain how modeling can be used before implementation

    You can use models to analyze and design software before you start coding.

    Suppose you are planning to implement a simple minesweeper game that has a text based UI and a GUI. Given below is a possible OOP design for the game.

    Before jumping into coding, you may want to find out things such as,

    • Is this class structure able to produce the behavior you want?
    • What API should each class have?
    • Do you need more classes?

    To answer these questions, you can analyze how the objects of these classes will interact with each other to produce the behavior you want.


    Basic

    Can use simple class diagrams and sequence diagrams to model an OO solution

    As mentioned in [Design → Modeling → Modeling a Solution → Introduction], this is the Minesweeper design you have come up with so far. Our objective is to analyze, evaluate, and refine that design.

    Let us start by modeling a sample interaction between the person playing the game and the TextUi object.

    newgame and clear x y represent commands typed by the Player on the TextUi.

    How does the TextUi object carry out the requests it has received from the player? It would need to interact with other objects of the system. Because the Logic class is the one that controls the game logic, the TextUi needs to collaborate with Logic to fulfill the newgame request. Let us extend the model to capture that interaction.

    W = Width of the minefield; H = Height of the minefield

    The above diagram assumes that W and H are the only information TextUi requires to display the minefield to the Player. Note that there could be other ways of doing this.

    The Logic methods you conceptualized in our modeling so far are:

    Now, let us look at what other objects and interactions are needed to support the newGame() operation. It is likely that a new Minefield object is created when the newGame() method is called.

    Note that the behavior of the Minefield constructor has been abstracted away. It can be designed at a later stage.

    Given below are the interactions between the player and the TextUi for the whole game.

    Note that can be used when discovering/defining the architecture-level APIs.

    Defining the architecture-level APIs for a small Tic-Tac-Toe game:


    Intermediate

    Can use intermediate class diagram and sequence diagram concepts to model an OO design

    Continuing with the example in [Design → Modeling → Modeling a Solution → Basic], next let us model how the TextUi interacts with the Logic to support the mark and clear operations until the game is won or lost.

    This interaction adds the following methods to the Logic class:

    • clearCellAt(int x, int y)
    • markCellAt(int x, int y)
    • getGameState(): GAME_STATE (GAME_STATE: READY, IN_PLAY, WON, LOST, …)

    And it adds the following operation to Logic API:

    • getAppearanceOfCellAt(int,int): CELL_APPEARANCE (CELL_APPEARANCE: HIDDEN, ZERO, ONE, TWO, THREE, …, MARKED, INCORRECTLY_MARKED, INCORRECTLY_CLEARED)

    In the above design, TextUi does not access Cell objects directly. Instead, it gets values of type CELL_APPEARANCE from Logic to be displayed as a minefield to the player. Alternatively, each cell or the entire minefield can be passed directly to TextUi.

    Here is the updated class diagram:

    The above is for the case when Actor Player interacts with the system using a text UI. Additional operations (if any) required for the GUI can be discovered similarly. -Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Suppose Logic supports a reset() operation. You can model it like this:

    Our current model assumes that the Minefield object has enough information (i.e. H, W, and mine locations) to create itself.

    An alternative is to have a ConfigGenerator object that generates a string containing the minefield information as shown below.

    In addition, getWidth(), getHeight(), markCellAt(x,y) and clearCellAt(x,y) can be handled like this.

    The updated class diagram:

    How is the getGameState() operation supported? Given below are two ways (there could be other ways):

    1. The Minefield class knows the state of the game at any time. The Logic class retrieves it from the Minefield class as and when required.
    2. The Logic class maintains the state of the game at all times.

    Here’s the SD for option 1.

    Here’s the SD for option 2. Assume that the game state is updated after every mark/clear action.

    It is now time to explore what happens inside the Minefield constructor. One way is to design it as follows.

    Now let us assume that Minesweeper supports a ‘timing’ feature.

    Updated class diagram:

    When designing components, it is not necessary to draw elaborate UML diagrams capturing all details of the design. They can be done as rough sketches. For example, draw sequence diagrams only when you are not sure which operations are required by each class, or when you want to verify that your class structure can indeed support the required operations.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/modeling.page-vue-render.js b/se-book-adapted/chapters/modeling.page-vue-render.js index aa61288eaa..125428a138 100644 --- a/se-book-adapted/chapters/modeling.page-vue-render.js +++ b/se-book-adapted/chapters/modeling.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"modeling"}},[_c('span',[_v("Modeling")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#modeling","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/oop.html b/se-book-adapted/chapters/oop.html index 4b5dbc3b45..fb3caaa49e 100644 --- a/se-book-adapted/chapters/oop.html +++ b/se-book-adapted/chapters/oop.html @@ -906,7 +906,7 @@ -


    Polymorphism

    What

    : Can explain OOP polymorphism

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".


    How

    : Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism




    More

    Miscellaneous

    Can answer frequently asked OOP questions

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.


    Review

    Can combine some OOP concepts

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +


    Polymorphism

    What

    : Can explain OOP polymorphism

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    Polymorphism allows you to write code targeting superclass objects, use that code on subclass objects, and achieve possibly different results based on the actual class of the object.

    Assume classes Cat and Dog are both subclasses of the Animal class. You can write code targeting Animal objects and use that code on Cat and Dog objects, achieving possibly different results based on whether it is a Cat object or a Dog object. Some examples:

    • Declare an array of type Animal and still be able to store Dog and Cat objects in it.
    • Define a method that takes an Animal object as a parameter and yet be able to pass Dog and Cat objects to it.
    • Call a method on a Dog or a Cat object as if it is an Animal object (i.e., without knowing whether it is a Dog object or a Cat object) and get a different response from it based on its actual class e.g., call the Animal class's method speak() on object a and get a "Meow" as the return value if a is a Cat object and "Woof" if it is a Dog object.

    Polymorphism literally means "ability to take many forms".


    How

    : Can explain how substitutability operation overriding, and dynamic binding relates to polymorphism

    Three concepts combine to achieve polymorphism: substitutability, operation overriding, and dynamic binding.

    • Substitutability: Because of substitutability, you can write code that expects objects of a parent class and yet use that code with objects of child classes. That is how polymorphism is able to treat objects of different types as one type.
    • Overriding: To get polymorphic behavior from an operation, the operation in the superclass needs to be overridden in each of the subclasses. That is how overriding allows objects of different subclasses to display different behaviors in response to the same method call.
    • Dynamic binding: Calls to overridden methods are bound to the implementation of the actual object's class dynamically during the runtime. That is how the polymorphic code can call the method of the parent class and yet execute the implementation of the child class.

    Exercises:

    Concepts related to polymorphism




    More

    Miscellaneous

    Can answer frequently asked OOP questions

    What is the difference between a Class, an Abstract Class, and an Interface?

    • An interface is a behavior specification with no implementation.
    • A class is a behavior specification + implementation.
    • An abstract class is a behavior specification + a possibly incomplete implementation.

    How does overriding differ from overloading?

    Overloading is used to indicate that multiple operations do similar things but take different parameters. Overloaded methods have the same method name but different method signatures and possibly different return types.

    Overriding is when a sub-class redefines an operation using the same method name and the same type signature. Overridden methods have the same name, same method signature, and same return type.


    Review

    Can combine some OOP concepts

    ...


    Exercises:

    In the context of OOP, what is the relationship between abstraction and encapsulation?


    Which of these do not belong to the four main OO principles?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/oop.page-vue-render.js b/se-book-adapted/chapters/oop.page-vue-render.js index dd53acc69e..605f27a59a 100644 --- a/se-book-adapted/chapters/oop.page-vue-render.js +++ b/se-book-adapted/chapters/oop.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"object-oriented-programming"}},[_c('span',[_v("Object-Oriented Programming")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#object-oriented-programming","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/principles.html b/se-book-adapted/chapters/principles.html index a2490e7375..408b87388f 100644 --- a/se-book-adapted/chapters/principles.html +++ b/se-book-adapted/chapters/principles.html @@ -175,7 +175,7 @@ -

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.


    Exercises:

    Examples for LoD


    LoD violation?


    Odd one out



    YAGNI Principle

    Can explain YAGNI principle

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    The principle says that some capability you presume your software needs in the future should not be built now because chances are "you aren't gonna need it". The rationale is that you do not have perfect information about the future and therefore some of the extra work you do to fulfill a potential future need might go to waste when some of your predictions fail to materialize.


    Resources:
    • Yagni -- A detailed article explaining YAGNI, written by Martin Fowler.

    DRY Principle

    Can explain DRY principle

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    This principle guards against the duplication of information.

    A functionality being implemented twice is a violation of the DRY principle even if the two implementations are different.

    The value of a system-wide timeout being defined in multiple places is a violation of DRY.


    Brooks' Law

    Can explain Brooks' law

    Brooks' law: Adding people to a late project will make it later. -- Fred Brooks (author of The Mythical Man-Month)

    Explanation: The additional communication overhead will outweigh the benefit of adding extra manpower, especially if done near a deadline.


    Exercises:

    Brook’s Law vs school project


    Which one is related to Brook's law?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    LoD aims to prevent objects from navigating the internal structures of other objects.

    An analogy for LoD can be drawn from Facebook. If Facebook followed LoD, you would not be allowed to see posts of friends of friends, unless they are your friends as well. If Jake is your friend and Adam is Jake’s friend, you should not be allowed to see Adam’s posts unless Adam is a friend of yours as well.


    Exercises:

    Examples for LoD


    LoD violation?


    Odd one out



    YAGNI Principle

    Can explain YAGNI principle

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    The principle says that some capability you presume your software needs in the future should not be built now because chances are "you aren't gonna need it". The rationale is that you do not have perfect information about the future and therefore some of the extra work you do to fulfill a potential future need might go to waste when some of your predictions fail to materialize.


    Resources:
    • Yagni -- A detailed article explaining YAGNI, written by Martin Fowler.

    DRY Principle

    Can explain DRY principle

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    This principle guards against the duplication of information.

    A functionality being implemented twice is a violation of the DRY principle even if the two implementations are different.

    The value of a system-wide timeout being defined in multiple places is a violation of DRY.


    Brooks' Law

    Can explain Brooks' law

    Brooks' law: Adding people to a late project will make it later. -- Fred Brooks (author of The Mythical Man-Month)

    Explanation: The additional communication overhead will outweigh the benefit of adding extra manpower, especially if done near a deadline.


    Exercises:

    Brook’s Law vs school project


    Which one is related to Brook's law?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/principles.page-vue-render.js b/se-book-adapted/chapters/principles.page-vue-render.js index de6aa34e37..e494b83751 100644 --- a/se-book-adapted/chapters/principles.page-vue-render.js +++ b/se-book-adapted/chapters/principles.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"principles"}},[_c('span',[_v("Principles")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#principles","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/processModels.html b/se-book-adapted/chapters/processModels.html index 9e4eac2953..b25176e8b5 100644 --- a/se-book-adapted/chapters/processModels.html +++ b/se-book-adapted/chapters/processModels.html @@ -15,7 +15,7 @@

    SDLC process models

    Introduction

    What

    Can explain SDLC process models

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.


    Sequential Models

    Can explain sequential process models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.


    Iterative Models

    Can explain iterative process models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.


    Agile Models

    Can explain agile process models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes




    Example process models

    XP

    Can explain XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.


    Scrum

    Can explain scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes



    Unified Process

    Can explain the Unified Process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process




    More

    CMMI

    Can explain CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.



    Summary

    Recap

    Can explain process models at a higher level

    This section has some exercises that cover multiple topics related to SDLC process models.


    Exercises:

    Sequential vs iterative approach


    Agile processes, Pair programming, Test-driven development


    The two basic process models


    Statements about sequential and iterative process models


    Risk of overshooting a deadline




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    SDLC process models

    Introduction

    What

    Can explain SDLC process models

    Software development goes through different stages such as requirements, analysis, design, implementation and testing. These stages are collectively known as the software development lifecycle (SDLC). There are several approaches, known as software development lifecycle models (also called software process models), that describe different ways to go through the SDLC. Each process model prescribes a 'roadmap' for the software developers to manage the development effort. The roadmap describes the aims of the development stages, the outcome of each stage, and the workflow i.e. the relationship between stages.


    Sequential Models

    Can explain sequential process models

    The sequential model, also called the waterfall model, views software development as a linear process, in which the project is seen as progressing through the development stages. The name waterfall stems from how the model is drawn to look like a waterfall (see below).

    When one stage of the process is completed, it produces some artifacts to be used in the next stage. For example, the requirements stage produces a comprehensive list of requirements, to be used in the design phase.

    A strict sequential model project moves only in the forward direction i.e., each stage is completed before starting the next. For example, once the requirements stage is over, there is no provision for revising the requirements later.

    This model can work well for a project that produces software to solve a well-understood problem, in which case the requirements can remain stable and the effort can be estimated accurately. Furthermore, as each stage has a well-defined outcome, it is easy to track the progress of the project because one can gauge the project progress by monitoring which stage the project is in.

    However, real-world projects often tackle problems that are not well-understood at the beginning, making them unsuitable for this model. For example, target users of a software product may not be able to state their requirements accurately at the start of the project, if they have not used a similar product before.


    Iterative Models

    Can explain iterative process models

    The iterative model advocates producing the software by going through several iterations. Each of the iterations could potentially go through all the stages of the SDLC, from requirements gathering to deployment.

    Each iteration produces a new version of the product, building upon the version produced in the previous iteration. Feedback from each iteration is factored into the subsequent iterations. For example, if an implementation task took longer than expected, the effort estimate for a similar tasks in future iterations can be adjusted accordingly. Similarly, if a feature introduced in the current iteration was not well-received by target users, it can be removed or tweaked in the next iteration.

    The iterative model can be done in breadth-first or depth-first approach.

    • In the breadth-first approach, an iteration evolves all major components and all functionality areas in parallel i.e., most features and most will be updated in each iteration, producing a working product at the end of each iteration.
    • In the depth-first approach, an iteration focuses on fleshing out only some components or some functionality area. Accordingly, early depth-first iterations might not produce a working product.

    Taking a Minesweeper game as an example,

    • breadth-first iterations will deliver a fully playable version early. These early versions may have primitive functionality, for example, a rudimentary text based UI, fixed board size, limited minefield layouts, etc. These functionalities (and corresponding components) will then be improved in later releases.
    • an early depth-first iteration could deliver the full user interface (UI) but with no game logic at all. Alternatively, an early iteration could focus on just the logic for generating initial layouts of the minefield. Neither will be a playable version of the game but both can be used to collect early feedback (about the UI, and the initial minefield layouts, respectively) which can then be used to guide later iterations.

    A project can be done as a mixture of breadth-first and depth-first iterations i.e., an iteration can contain some breadth-first work as well as some depth-first work, or, some iterations can be breadth-first while others are depth-first.


    Agile Models

    Can explain agile process models

    In 2001, a group of prominent software engineering practitioners met and brainstormed for an alternative to documentation-driven, heavyweight software development processes that were used in most large projects at the time. This resulted in something called the agile manifesto (a vision statement of what they were looking to do).

    You are uncovering better ways of developing software by doing it and helping others do it.

    Through this work you have come to value:

    • Individuals and interactions over processes and tools
    • Working software over comprehensive documentation
    • Customer collaboration over contract negotiation
    • Responding to change over following a plan

    That is, while there is value in the items on the right, you value the items on the left more.
    -- Extract from the Agile Manifesto

    Subsequently, some of the signatories of the manifesto went on to create process models that try to follow it. These processes are collectively called agile processes. Some of the key features of agile approaches are:

    • Requirements are prioritized based on the needs of the user, are clarified regularly (at times almost on a daily basis) with the entire project team, and are factored into the development schedule as appropriate.
    • Instead of doing a very elaborate and detailed design and a project plan for the whole project, the team works based on a rough project plan and a high level design that evolves as the project goes on.
    • There is a strong emphasis on complete transparency and responsibility sharing among the team members. The team is responsible together for the delivery of the product. Team members are accountable, and regularly and openly share progress with each other and with the user.

    There are a number of agile processes in the development world today. eXtreme Programming (XP) and Scrum are two of the well-known ones.


    Exercises:

    Statements about agile processes




    Example process models

    XP

    Can explain XP

    The following description was adapted from the XP home page, emphasis added:

    Extreme Programming (XP) stresses customer satisfaction. Instead of delivering everything you could possibly want on some date far in the future, this process delivers the software you need as you need it.

    XP aims to empower developers to confidently respond to changing customer requirements, even late in the lifecycle.

    XP emphasizes teamwork. Managers, customers, and developers are all equal partners in a collaborative team. XP implements a simple, yet effective environment enabling teams to become highly productive. The team self-organizes around the problem to solve it as efficiently as possible.

    XP aims to improve a software project in five essential ways: communication, simplicity, feedback, respect, and courage. Extreme Programmers constantly communicate with their customers and fellow programmers. They keep their design simple and clean. They get feedback by testing their software starting on day one. Every small success deepens their respect for the unique contributions of each and every team member. With this foundation, Extreme Programmers are able to courageously respond to changing requirements and technology.

    XP has a set of simple rules. XP is a lot like a jig saw puzzle with many small pieces. Individually the pieces make no sense, but when combined together a complete picture can be seen. This flow chart shows how Extreme Programming's rules work together.

    Pair programming, CRC cards, project velocity, and standup meetings are some interesting topics related to XP. Refer to http://www.extremeprogramming.org to find out more about XP.


    Scrum

    Can explain scrum

    This description of Scrum was adapted from Wikipedia [retrieved on 18/10/2011], emphasis added:

    Scrum is a process skeleton that contains sets of practices and predefined roles. The main roles in Scrum are:

    • The Scrum Master, who maintains the processes (typically in lieu of a project manager)
    • The Product Owner, who represents the stakeholders and the business
    • The Team, a cross-functional group who do the actual analysis, design, implementation, testing, etc.

    A Scrum project is divided into iterations called Sprints. A sprint is the basic unit of development in Scrum. Sprints tend to last between one week and one month, and are a timeboxed (i.e. restricted to a specific duration) effort of a constant length.

    Each sprint is preceded by a planning meeting, where the tasks for the sprint are identified and an estimated commitment for the sprint goal is made, and followed by a review or retrospective meeting, where the progress is reviewed and lessons for the next sprint are identified.

    During each sprint, the team creates a potentially deliverable product increment (for example, working and tested software). The set of features that go into a sprint come from the product backlog, which is a prioritized set of high level requirements of work to be done. Which backlog items go into the sprint is determined during the sprint planning meeting. During this meeting, the Product Owner informs the team of the items in the product backlog that he or she wants completed. The team then determines how much of this they can commit to complete during the next sprint, and records this in the sprint backlog. During a sprint, no one is allowed to change the sprint backlog, which means that the requirements are frozen for that sprint. Development is timeboxed such that the sprint must end on time; if requirements are not completed for any reason they are left out and returned to the product backlog. After a sprint is completed, the team demonstrates the use of the software.

    Scrum enables the creation of self-organizing teams by encouraging co-location of all team members, and verbal communication between all team members and disciplines in the project.

    A key principle of Scrum is its recognition that during a project the customers can change their minds about what they want and need (often called requirements churn), and that unpredicted challenges cannot be easily addressed in a traditional predictive or planned manner. As such, Scrum adopts an empirical approach—accepting that the problem cannot be fully understood or defined, focusing instead on maximizing the team’s ability to deliver quickly and respond to emerging requirements.

    Daily Scrum is another key scrum practice. The description below was adapted from https://www.mountaingoatsoftware.com (emphasis added):

    In Scrum, on each day of a sprint, the team holds a daily scrum meeting called the "daily scrum.” Meetings are typically held in the same location and at the same time each day. Ideally, a daily scrum meeting is held in the morning, as it helps set the context for the coming day's work. These scrum meetings are strictly time-boxed to 15 minutes. This keeps the discussion brisk but relevant.

    ...

    During the daily scrum, each team member answers the following three questions:

    • What did you do yesterday?
    • What will you do today?
    • Are there any impediments in your way?

    ...

    The daily scrum meeting is not used as a problem-solving or issue resolution meeting. Issues that are raised are taken offline and usually dealt with by the relevant subgroup immediately after the meeting.

    Intro to Scrum in Under 10 Minutes



    Unified Process

    Can explain the Unified Process

    The unified process is developed by the Three Amigos - Ivar Jacobson, Grady Booch and James Rumbaugh (the creators of UML).

    The unified process consists of four phases: inception, elaboration, construction and transition. The main purpose of each phase can be summarized as follows:

    Phase Activities Typical Artifacts
    Inception
    • Understand the problem and requirements
    • Communicate with customer
    • Plan the development effort
    • Basic use case model
    • Rough project plan
    • Project vision and scope
    Elaboration
    • Refine and expand requirements
    • Determine a high-level design e.g. system architecture
    • System architecture
    • Various design models
    • Prototype
    Construction
    • Major implementation effort to support the use cases identified
    • Design models are refined and fleshed out
    • Testing of all levels are carried out
    • Multiple releases of the system
    • Test cases of all levels
    • System release
    Transition
    • Ready the system for actual production use
    • Familiarize end users with the system
    • Final system release
    • Instruction manual

    Given above is a visualization of a project done using the Unified process (source: Wikipedia). As the diagram shows, a phase can consist of several iterations. Each vertical column (labeled “I1” “E1”, “E2”, “C1”, etc.) represents a single iteration. Each of the iterations consists of a set of ‘workflows’ such as ‘Business modeling’, ‘Requirements’, ‘Analysis & Design’, etc. The shaded region indicates the amount of resources and effort spent on a particular workflow in a particular iteration.

    Unified process is a flexible and customizable process model framework rather than a single fixed process. For example, the number of iterations in each phase, definition of workflows, and the intensity of a given workflow in a given iteration can be adjusted according to the nature of the project. Take the Construction Phase: to develop a simple system, one or two iterations would be sufficient. For a more complicated system, multiple iterations will be more helpful. Therefore, the diagram above simply records a particular application of the UP rather than prescribe how the UP is to be applied. However, this record can be refined and reused for similar future projects.


    Exercises:

    Statements about the unified process




    More

    CMMI

    Can explain CMMI

    CMMI (Capability Maturity Model Integration) is a process improvement approach defined by Software Engineering Institute at Carnegie Melon University. CMMI provides organizations with the essential elements of effective processes, which will improve their performance. -- adapted from http://www.sei.cmu.edu/cmmi/

    CMMI defines five maturity levels for a process and provides criteria to determine if the process of an organization is at a certain maturity level. The diagram below [taken from Wikipedia] gives an overview of the five levels.



    Summary

    Recap

    Can explain process models at a higher level

    This section has some exercises that cover multiple topics related to SDLC process models.


    Exercises:

    Sequential vs iterative approach


    Agile processes, Pair programming, Test-driven development


    The two basic process models


    Statements about sequential and iterative process models


    Risk of overshooting a deadline




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/processModels.page-vue-render.js b/se-book-adapted/chapters/processModels.page-vue-render.js index 78a963ff11..8bd1fd5788 100644 --- a/se-book-adapted/chapters/processModels.page-vue-render.js +++ b/se-book-adapted/chapters/processModels.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"sdlc-process-models"}},[_c('span',[_v("SDLC process models")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#sdlc-process-models","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/projectPlanning.html b/se-book-adapted/chapters/projectPlanning.html index 0de7e08314..47951e2a29 100644 --- a/se-book-adapted/chapters/projectPlanning.html +++ b/se-book-adapted/chapters/projectPlanning.html @@ -23,7 +23,7 @@ Implementation
    1. User Interface
    2. Game Logic
    3. Persistency Support
    4.5 man day -
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Exercises:

    Which one is not a well-defined task?



    Milestones

    Can explain milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested

    Buffers

    Can explain buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.


    Issue Trackers

    Can explain issue trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):


    GANTT Charts

    Can explain Gantt charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.


    PERT Charts

    Can explain PERT charts

    A PERT (Program Evaluation Review Technique) chart uses a graphical technique to show the order/sequence of tasks. It is based on the simple idea of drawing a directed graph in which:

    • Nodes or vertices capture the effort estimations of tasks, and
    • Arrows depict the precedence between tasks

    An example PERT chart for a simple software project


    md = man days

    A PERT chart can help determine the following important information:

    • The order of tasks. In the example above, Final Testing cannot begin until all coding of individual subsystems have been completed.
    • Which tasks can be done concurrently. In the example above, the various subsystem designs can start independently once the High level design is completed.
    • The shortest possible completion time. In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.
    • The Critical Path. In the example above, the shaded path is also the critical path.

    Critical path is the path in which any delay can directly affect the project duration. It is important to ensure tasks on the critical path are completed on time.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    • 1.5 man day
    • 2 man day
    • 1 man day
    • B.1
    • B.2
    • B.3
    D System Testing 1 man day C E Planning for next version 1 man day D

    All tasks should be well-defined. In particular, it should be clear as to when the task will be considered done.

    Some examples of ill-defined tasks and their better-defined counterparts:

    Bad Better
    more coding implement component X
    do research on UI testing find a suitable tool for testing the UI

    Exercises:

    Which one is not a well-defined task?



    Milestones

    Can explain milestones

    A milestone is the end of a stage which indicates significant progress. You should take into account dependencies and priorities when deciding on the features to be delivered at a certain milestone.

    Each intermediate product release is a milestone.

    In some projects, it is not practical to have a very detailed plan for the whole project due to the uncertainty and unavailability of required information. In such cases, you can use a high-level plan for the whole project and a detailed plan for the next few milestones.

    Milestones for the Minesweeper project, iteration 1

    Day Milestones
    Day 1 Architecture skeleton completed
    Day 3 ‘new game’ feature implemented
    Day 4 ‘new game’ feature tested

    Buffers

    Can explain buffers

    A buffer is time set aside to absorb any unforeseen delays. It is very important to include buffers in a software project schedule because effort/time estimations for software development are notoriously hard. However, do not inflate task estimates to create hidden buffers; have explicit buffers instead. Reason: With explicit buffers, it is easier to detect incorrect effort estimates which can serve as feedback to improve future effort estimates.


    Issue Trackers

    Can explain issue trackers

    Keeping track of project tasks (who is doing what, which tasks are ongoing, which tasks are done etc.) is an essential part of project management. In small projects, it may be possible to keep track of tasks using simple tools such as online spreadsheets or general-purpose/light-weight task tracking tools such as Trello. Bigger projects need more sophisticated task tracking tools.

    Issue trackers (sometimes called bug trackers) are commonly used to track task assignment and progress. Most online project management software such as GitHub, SourceForge, and BitBucket come with an integrated issue tracker.

    A screenshot from the Jira Issue tracker software (Jira is part of the BitBucket project management tool suite):


    GANTT Charts

    Can explain Gantt charts

    A Gantt chart is a 2-D bar-chart, drawn as time vs tasks (represented by horizontal bars).

    A sample Gantt chart:

    In a Gantt chart, a solid bar represents the main task, which is generally composed of a number of subtasks, shown as grey bars. The diamond shape indicates an important deadline/deliverable/milestone.


    PERT Charts

    Can explain PERT charts

    A PERT (Program Evaluation Review Technique) chart uses a graphical technique to show the order/sequence of tasks. It is based on the simple idea of drawing a directed graph in which:

    • Nodes or vertices capture the effort estimations of tasks, and
    • Arrows depict the precedence between tasks

    An example PERT chart for a simple software project


    md = man days

    A PERT chart can help determine the following important information:

    • The order of tasks. In the example above, Final Testing cannot begin until all coding of individual subsystems have been completed.
    • Which tasks can be done concurrently. In the example above, the various subsystem designs can start independently once the High level design is completed.
    • The shortest possible completion time. In the example above, there is a path (indicated by the shaded boxes) from start to end that determines the shortest possible completion time.
    • The Critical Path. In the example above, the shaded path is also the critical path.

    Critical path is the path in which any delay can directly affect the project duration. It is important to ensure tasks on the critical path are completed on time.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/projectPlanning.page-vue-render.js b/se-book-adapted/chapters/projectPlanning.page-vue-render.js index ae0ea5bbd0..cc3732f2ba 100644 --- a/se-book-adapted/chapters/projectPlanning.page-vue-render.js +++ b/se-book-adapted/chapters/projectPlanning.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"project-planning"}},[_c('span',[_v("Project planning")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-planning","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/qualityAssurance.html b/se-book-adapted/chapters/qualityAssurance.html index 99f89601a7..579cf6de91 100644 --- a/se-book-adapted/chapters/qualityAssurance.html +++ b/se-book-adapted/chapters/qualityAssurance.html @@ -15,7 +15,7 @@

    Quality assurance

    Introduction

    What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    Validation vs Verification

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification




    Code reviews

    What

    Can explain code reviews

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:


    Static analysis

    What

    Can explain static analysis

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.



    Formal verification

    What

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Quality assurance

    Introduction

    What

    Can explain software quality assurance

    Software Quality Assurance (QA) is the process of ensuring that the software being built has the required levels of quality.

    While testing is the most common activity used in QA, there are other complementary techniques such as static analysis, code reviews, and formal verification.


    Validation vs Verification

    Can explain validation and verification

    Quality Assurance = Validation + Verification

    QA involves checking two aspects:

    1. Validation: are you building the right system i.e., are the requirements correct?
    2. Verification: are you building the system right i.e., are the requirements implemented correctly?

    Whether something belongs under validation or verification is not that important. What is more important is that both are done, instead of limiting to only verification (i.e., remember that the requirements can be wrong too).


    Exercises:

    Statements about validation and verification




    Code reviews

    What

    Can explain code reviews

    Code review is the systematic examination of code with the intention of finding where the code can be improved.

    Reviews can be done in various forms. Some examples below:

    • Pull Request reviews

      • Project Management Platforms such as GitHub and BitBucket allow the new code to be proposed as Pull Requests and provide the ability for others to review the code in the PR.
    • In pair programming

      • As pair programming involves two programmers working on the same code at the same time, there is an implicit review of the code by the other member of the pair.
    • Formal inspections

      • Inspections involve a group of people systematically examining project artifacts to discover defects. Members of the inspection team play various roles during the process, such as:

        • the author - the creator of the artifact
        • the moderator - the planner and executor of the inspection meeting
        • the secretary - the recorder of the findings of the inspection
        • the inspector/reviewer - the one who inspects/reviews the artifact

    Advantages of code review over testing:

    • It can detect functionality defects as well as other problems such as coding standard violations.
    • It can verify non-code artifacts and incomplete code.
    • It does not require test drivers or stubs.

    Disadvantages:

    • It is a manual process and therefore, error prone.

    Resources:


    Static analysis

    What

    Can explain static analysis

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static analysis of code can find useful information such as unused variables, unhandled exceptions, style errors, and statistics. Most modern IDEs come with some inbuilt static analysis capabilities. For example, an IDE can highlight unused variables as you type the code into the editor.

    The term static in static analysis refers to the fact that the code is analyzed without executing the code. In contrast, dynamic analysis requires the code to be executed to gather additional information about the code e.g., performance characteristics.

    Higher-end static analysis tools (static analyzers) can perform more complex analysis such as locating potential bugs, memory leaks, inefficient code structures, etc.

    Some example static analyzers for Java: CheckStyle, PMD, FindBugs

    Linters are a subset of static analyzers that specifically aim to locate areas where the code can be made 'cleaner'.



    Formal verification

    What

    Can explain formal verification

    Formal verification uses mathematical techniques to prove the correctness of a program.

    An introduction to Formal Methods


    Advantages:

    • Formal verification can be used to prove the absence of errors. In contrast, testing can only prove the presence of errors, not their absence.

    Disadvantages:

    • It only proves the compliance with the specification, but not the actual utility of the software.
    • It requires highly specialized notations and knowledge which makes it an expensive technique to administer. Therefore, formal verifications are more commonly used in safety-critical software such as flight control systems.

    Exercises:

    Absence of errors




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/qualityAssurance.page-vue-render.js b/se-book-adapted/chapters/qualityAssurance.page-vue-render.js index 35b60a9d78..97d3cf3b49 100644 --- a/se-book-adapted/chapters/qualityAssurance.page-vue-render.js +++ b/se-book-adapted/chapters/qualityAssurance.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"quality-assurance"}},[_c('span',[_v("Quality assurance")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#quality-assurance","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/refactoring.html b/se-book-adapted/chapters/refactoring.html index fc0aa33abf..b5fb5b448a 100644 --- a/se-book-adapted/chapters/refactoring.html +++ b/se-book-adapted/chapters/refactoring.html @@ -353,7 +353,7 @@

    Some IDEs have builtin support for basic refactorings such as automatically renaming a variable/method/class in all places it has been used.

    Refactoring, even if done with the aid of an IDE, may still result in regressions. Therefore, each small refactoring should be followed by regression testing.


    Exercises:

    Results of Refactoring


    Do you agree with the following statement? Refactoring and regression testing


    Explain Refactoring



    When

    Can decide when to apply a given refactoring

    One way to identify refactoring opportunities is by code smells.

    A code smell is a surface indication that usually corresponds to a deeper problem in the system. First, a smell is by definition something that's quick to spot. Second, smells don't always indicate a problem.
    --adapted from https://martinfowler.com/bliki/CodeSmell.html

    An example (from the same source as above) is the code smell data class i.e., a class with all data and no behavior. When you encounter the such a class, you can explore if refactoring it to move the corresponding behavior into that class is appropriate. Some more examples:

    Periodic refactoring is a good way to pay off the technical debt a codebase has accumulated.

    Software systems are prone to the build up of cruft - deficiencies in internal quality that make it harder than it would ideally be to modify and extend the system further.Technical Debt is a metaphor, coined by Ward Cunningham, that frames how to think about dealing with this cruft, thinking of it like a financial debt. The extra effort that it takes to add new features is the interest paid on the debt.
    ---https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).


    Resources:

    Exercises:

    ‘Extract method’ and ‘Inline method’ refactorings



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +--https://martinfowler.com/bliki/TechnicalDebt.html

    While it is important to refactor frequently so as to avoid the accumulation of ‘messy’ code (aka technical debt), an important question is how much refactoring is too much refactoring? It is too much refactoring when the benefits no longer justify the cost. The costs and the benefits depend on the context. That is why some refactorings are ‘opposites’ of each other (e.g. extract method vs inline method).


    Resources:

    Exercises:

    ‘Extract method’ and ‘Inline method’ refactorings



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/refactoring.page-vue-render.js b/se-book-adapted/chapters/refactoring.page-vue-render.js index dbfafe32dd..e30b3c7797 100644 --- a/se-book-adapted/chapters/refactoring.page-vue-render.js +++ b/se-book-adapted/chapters/refactoring.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"refactoring"}},[_c('span',[_v("Refactoring")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#refactoring","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/requirements.html b/se-book-adapted/chapters/requirements.html index cfdd3a3f5f..10e690ae21 100644 --- a/se-book-adapted/chapters/requirements.html +++ b/se-book-adapted/chapters/requirements.html @@ -15,7 +15,7 @@

    Requirements

    Introduction

    Can explain requirements

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.


    Exercises:

    Stakeholders of an LMS



    Non-Functional Requirements

    Can explain non-functional requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Exercises:

    TEAMMATES NFRs



    Quality of Requirements

    Can explain quality of requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete

    Prioritizing Requirements

    Can explain prioritizing requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Requirements

    Introduction

    Can explain requirements

    A software requirement specifies a need to be fulfilled by the software product.

    A software project may be,

    • a brownfield project i.e., develop a product to replace/update an existing software product
    • a greenfield project i.e., develop a totally new system from scratch

    In either case, requirements need to be gathered, analyzed, specified, and managed.

    Requirements come from stakeholders.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Identifying requirements is often not easy. For example, stakeholders may not be aware of their precise needs, may not know how to communicate their requirements correctly, may not be willing to spend effort in identifying requirements, etc.


    Exercises:

    Stakeholders of an LMS



    Non-Functional Requirements

    Can explain non-functional requirements

    Requirements can be divided into two in the following way:

    1. Functional requirements specify what the system should do.
    2. Non-functional requirements specify the constraints under which the system is developed and operated.

    Some examples of non-functional requirement categories:

    • Data requirements e.g. size, , etc.,
    • Environment requirements e.g. technical environment in which the system would operate in or needs to be compatible with.
    • Accessibility, Capacity, Compliance with regulations, Documentation, Disaster recovery, Efficiency, Extensibility, Fault tolerance, Interoperability, Maintainability, Privacy, Portability, Quality, Reliability, Response time, Robustness, Scalability, Security, Stability, Testability, and more ...

    Some concrete examples of NFRs

    • Business/domain rules: e.g. the size of the minefield cannot be smaller than five.
    • Constraints: e.g. the system should be backward compatible with data produced by earlier versions of the system; system testers are available only during the last month of the project; the total project cost should not exceed $1.5 million.
    • Technical requirements: e.g. the system should work on both 32-bit and 64-bit environments.
    • Performance requirements: e.g. the system should respond within two seconds.
    • Quality requirements: e.g. the system should be usable by a novice who has never carried out an online purchase.
    • Process requirements: e.g. the project is expected to adhere to a schedule that delivers a feature set every one month.
    • Notes about project scope: e.g. the product is not required to handle the printing of reports.
    • Any other noteworthy points: e.g. the game should not use images deemed offensive to those injured in real mine clearing activities.

    You may have to spend an extra effort in digging NFRs out as early as possible because,

    1. NFRs are easier to miss e.g., stakeholders tend to think of functional requirements first
    2. sometimes NFRs are critical to the success of the software. E.g. A web application that is too slow or that has low security is unlikely to succeed even if it has all the right functionality.

    Exercises:

    TEAMMATES NFRs



    Quality of Requirements

    Can explain quality of requirements

    Here are some characteristics of well-defined requirements [📖 zielczynski]:

    • Unambiguous
    • Testable (verifiable)
    • Clear (concise, terse, simple, precise)
    • Correct
    • Understandable
    • Feasible (realistic, possible)
    • Independent
    • Necessary
    • Implementation-free (i.e. abstract)

    Besides these criteria for individual requirements, the set of requirements as a whole should be

    • Consistent
    • Non-redundant
    • Complete

    Prioritizing Requirements

    Can explain prioritizing requirements

    Requirements can be prioritized based on the importance and urgency, while keeping in mind the constraints of schedule, budget, staff resources, quality goals, and other constraints.

    A common approach is to group requirements into priority categories. Note that all such scales are subjective, and stakeholders define the meaning of each level in the scale for the project at hand.

    An example scheme for categorizing requirements:

    • Essential: The product must have this requirement fulfilled or else it does not get user acceptance.
    • Typical: Most similar systems have this feature although the product can survive without it.
    • Novel: New features that could differentiate this product from the rest.

    Other schemes:

    • High, Medium, Low
    • Must-have, Nice-to-have, Unlikely-to-have
    • Level 0, Level 1, Level 2, ...

    Some requirements can be discarded if they are considered ‘out of ’.

    The requirement given below is for a Calendar application. Stakeholders of the software (e.g. product designers) might decide the following requirement is not in the scope of the software.

    The software records the actual time taken by each task and show the difference between the actual and scheduled time for the task.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/requirements.page-vue-render.js b/se-book-adapted/chapters/requirements.page-vue-render.js index 8f881f1707..e25b5c856d 100644 --- a/se-book-adapted/chapters/requirements.page-vue-render.js +++ b/se-book-adapted/chapters/requirements.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"requirements"}},[_c('span',[_v("Requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#requirements","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/reuse.html b/se-book-adapted/chapters/reuse.html index 16dd2aa08b..dcd33c377f 100644 --- a/se-book-adapted/chapters/reuse.html +++ b/se-book-adapted/chapters/reuse.html @@ -15,7 +15,7 @@

    Reuse

    Introduction

    What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework




    APIs

    What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    Designing APIs

    Can design reasonable quality APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.


    Libraries

    What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.


    Frameworks

    What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks vs Libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?




    Platforms

    What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.


    Cloud computing

    What

    Can explain cloud computing

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.


    Iaas, PaaS, and SaaS

    Can distinguish between IaaS, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Reuse

    Introduction

    What

    Can explain software reuse

    Reuse is a major theme in software engineering practices. By reusing tried-and-tested components, the robustness of a new software system can be enhanced while reducing the manpower and time requirement. Reusable components come in many forms; it can be reusing a piece of code, a subsystem, or a whole software.


    When

    Can explain the costs and benefits of reuse

    While you may be tempted to use many libraries/frameworks/platforms that seem to crop up on a regular basis and promise to bring great benefits, note that there are costs associated with reuse. Here are some:

    • The reused code may be an overkill (think using a sledgehammer to crack a nut), increasing the size of, and/or degrading the performance of, your software.
    • The reused software may not be mature/stable enough to be used in an important product. That means the software can change drastically and rapidly, possibly in ways that break your software.
    • Non-mature software has the risk of dying off as fast as they emerged, leaving you with a dependency that is no longer maintained.
    • The license of the reused software (or its dependencies) restrict how you can use/develop your software.
    • The reused software might have bugs, missing features, or security vulnerabilities that are important to your product, but not so important to the maintainers of that software, which means those flaws will not get fixed as fast as you need them to.
    • Malicious code can sneak into your product via compromised dependencies.

    Exercises:

    Using a cool UI framework




    APIs

    What

    Can explain APIs

    An Application Programming Interface (API) specifies the interface through which other programs can interact with a software component. It is a contract between the component and its clients.

    A class has an API (e.g., API of the Java String class, API of the Python str class) which is a collection of public methods that you can invoke to make use of the class.

    The GitHub API is a collection of web request formats that the GitHub server accepts and their corresponding responses. You can write a program that interacts with GitHub through that API.

    When developing large systems, if you define the API of each component early, the development team can develop the components in parallel because the future behavior of the other components are now more predictable.


    Exercises:

    Statements about APIs


    True or False?



    Designing APIs

    Can design reasonable quality APIs

    An API should be well-designed (i.e. should cater for the needs of its users) and well-documented.

    When you write software consisting of multiple components, you need to define the API of each component.

    One approach is to let the API emerge and evolve over time as you write code.

    Another approach is to define the API up-front. Doing so allows us to develop the components in parallel.

    You can use UML sequence diagrams to analyze the required interactions between components in order to discover the required API. Given below is an example.

    Example:

    As you analyze the interactions between components using sequence diagrams, you discover the API of those components. For example, the diagram above tells us that the MSLogic component API should have the methods:

    • new()
    • getWidth:int
    • getHeight():int
    • getRemainingMineCount():int

    More details can be included to increase the precision of the method definitions before coding. Such precision is important to avoid misunderstandings between the developer of the class and developers of other classes that interact with the class.

    • Operation: newGame(): void
    • Description: Generates a new WxH minefield with M mines. Any existing minefield will be overwritten.
    • Preconditions: None
    • Postconditions: A new minefield is created. Game state is READY.

    Preconditions are the conditions that must be true before calling this operation. Postconditions describe the system after the operation is complete. Note that postconditions do not say what happens during the operation. Here is another example:

    • Operation: clearCellAt(int x, int y): void
    • Description: Records the cell at x, y as cleared.
    • Parameters: x, y coordinates of the cell
    • Preconditions: game state is READY or IN_PLAY. x and y are in 0..(H-1) and 0..(W-1), respectively.
    • Postconditions: Cell at x, y changes state to ZERO, ONE, TWO, THREE, …, EIGHT, or INCORRECTLY_CLEARED. Game state changes to IN_PLAY, WON or LOST as appropriate.


    Libraries

    What

    Can explain libraries

    A library is a collection of modular code that is general and can be used by other programs.

    Java classes you get with the JDK (such as String, ArrayList, HashMap, etc.) are library classes that are provided in the default Java distribution.

    Natty is a Java library that can be used for parsing strings that represent dates e.g. The 31st of April in the year 2008

    built-in modules you get with Python (such as csv, random, sys, etc.) are libraries that are provided in the default Python distribution. Classes such as list, str, dict are built-in library classes that you get with Python.

    Colorama is a Python library that can be used for colorizing text in a CLI.


    How

    Can make use of a library

    These are the typical steps required to use a library:

    1. Read the documentation to confirm that its functionality fits your needs.
    2. Check the license to confirm that it allows reuse in the way you plan to reuse it. For example, some libraries might allow non-commercial use only.
    3. Download the library and make it accessible to your project. Alternatively, you can configure your to do it for you.
    4. Call the library API from your code where you need to use the library's functionality.


    Frameworks

    What

    Can explain frameworks

    The overall structure and execution flow of a specific category of software systems can be very similar. The similarity is an opportunity to reuse at a high scale.

    Running example:

    IDEs for different programming languages are similar in how they support editing code, organizing project files, debugging, etc.

    A software framework is a reusable implementation of a software (or part thereof) providing generic functionality that can be selectively customized to produce a specific application.

    Running example:

    Eclipse is an IDE framework that can be used to create IDEs for different programming languages.

    Some frameworks provide a complete implementation of a default behavior which makes them immediately usable.

    Running example:

    Eclipse is a fully functional Java IDE out-of-the-box.

    A framework facilitates the adaptation and customization of some desired functionality.

    Running example:

    The Eclipse plugin system can be used to create an IDE for different programming languages while reusing most of the existing IDE features of Eclipse.

    E.g. https://marketplace.eclipse.org/content/pydev-python-ide-eclipse

    Some frameworks cover only a specific component or an aspect.

    JavaFX is a framework for creating Java GUIs. Tkinter is a GUI framework for Python.

    More examples of frameworks

    • Frameworks for web-based applications: Drupal (PHP), Django (Python), Ruby on Rails (Ruby), Spring (Java)
    • Frameworks for testing: JUnit (Java), unittest (Python), Jest (JavaScript)

    Frameworks vs Libraries

    Can differentiate between frameworks and libraries

    Although both frameworks and libraries are reuse mechanisms, there are notable differences:

    • Libraries are meant to be used ‘as is’ while frameworks are meant to be customized/extended. e.g., writing plugins for Eclipse so that it can be used as an IDE for different languages (C++, PHP, etc.), adding modules and themes to Drupal, and adding test cases to JUnit.

    • Your code calls the library code while the framework code calls your code. Frameworks use a technique called inversion of control, aka the “Hollywood principle” (i.e. don’t call us, we’ll call you!). That is, you write code that will be called by the framework, e.g. writing test methods that will be called by the JUnit framework. In the case of libraries, your code calls libraries.


    Exercises:

    Statement about software frameworks


    Which are frameworks?




    Platforms

    What

    Can explain platforms

    A platform provides a runtime environment for applications. A platform is often bundled with various libraries, tools, frameworks, and technologies in addition to a runtime environment but the defining characteristic of a software platform is the presence of a runtime environment.

    Technically, an operating system can be called a platform. For example, Windows PC is a platform for desktop applications while iOS is a platform for mobile applications.

    Two well-known examples of platforms are JavaEE and .NET, both of which sit above the operating systems layer, and are used to develop enterprise applications. Infrastructure services such as connection pooling, load balancing, remote code execution, transaction management, authentication, security, messaging etc. are done similarly in most enterprise applications. Both JavaEE and .NET provide these services to applications in a customizable way without developers having to implement them from scratch every time.

    • JavaEE (Java Enterprise Edition) is both a framework and a platform for writing enterprise applications. The runtime used by JavaEE applications is the JVM (Java Virtual Machine) that can run on different Operating Systems.
    • .NET is a similar platform and framework. Its runtime is called CLR (Common Language Runtime) and it is usually used on Windows machines.


    Cloud computing

    What

    Can explain cloud computing

    Cloud computing is the delivery of computing as a service over the network, rather than a product running on a local machine. This means the actual hardware and software is located at a remote location, typically, at a large server farm, while users access them over the network. Maintenance of the hardware and software is managed by the cloud provider while users typically pay for only the amount of services they use. This model is similar to the consumption of electricity; the power company manages the power plant, while the consumers pay them only for the electricity used. The cloud computing model optimizes hardware and software utilization and reduces the cost to consumers. Furthermore, users can scale up/down their utilization at will without having to upgrade their hardware and software. The traditional non-cloud model of computing is similar to everyone buying their own generators to create electricity for their own use.


    Iaas, PaaS, and SaaS

    Can distinguish between IaaS, PaaS, and SaaS


    source: https://commons.wikimedia.org

    Cloud computing can deliver computing services at three levels:

    1. Infrastructure as a service (IaaS) delivers computer infrastructure as a service. For example, a user can deploy virtual servers on the cloud instead of buying physical hardware and installing server software on them. Another example would be a customer using storage space on the cloud for off-site storage of data. Rackspace is an example of an IaaS cloud provider. Amazon Elastic Compute Cloud (Amazon EC2) is another one.

    2. Platform as a service (PaaS) provides a platform on which developers can build applications. Developers do not have to worry about infrastructure issues such as deploying servers or load balancing as is required when using IaaS. Those aspects are automatically taken care of by the platform. The price to pay is reduced flexibility; applications written on PaaS are limited to facilities provided by the platform. A PaaS example is the Google App Engine where developers can build applications using Java, Python, PHP, or Go whereas Amazon EC2 allows users to deploy applications written in any language on their virtual servers.

    3. Software as a service (SaaS) allows applications to be accessed over the network instead of installing them on a local machine. For example, Google Docs is a SaaS word processing software, while Microsoft Word is a traditional word processing software.


    Exercises:

    Google Calendar is in which category?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/reuse.page-vue-render.js b/se-book-adapted/chapters/reuse.page-vue-render.js index 147a788717..1c8568ffa7 100644 --- a/se-book-adapted/chapters/reuse.page-vue-render.js +++ b/se-book-adapted/chapters/reuse.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"reuse"}},[_c('span',[_v("Reuse")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#reuse","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/revisionControl.html b/se-book-adapted/chapters/revisionControl.html index 741a84e08e..e201ccb6e3 100644 --- a/se-book-adapted/chapters/revisionControl.html +++ b/se-book-adapted/chapters/revisionControl.html @@ -17,7 +17,7 @@

    Revision control

    What

    Can explain revision control

    Given below is a general introduction to revision control, adapted from bryan-mercurial-guide:

    Revision control is the process of managing multiple versions of a piece of information. In its simplest form, this is something that many people do by hand: every time you modify a file, save it under a new name that contains a number, each one higher than the number of the preceding version.

    Manually managing multiple versions of even a single file is an error-prone task, though, so software tools to help automate this process have long been available. The earliest automated revision control tools were intended to help a single user to manage revisions of a single file. Over the past few decades, the scope of revision control tools has expanded greatly; they now manage multiple files, and help multiple people to work together. The best modern revision control tools have no problem coping with thousands of people working together on projects that consist of hundreds of thousands of files.

    There are a number of reasons why you or your team might want to use an automated revision control tool for a project.

    • It will track the history and evolution of your project, so you don't have to. For every change, you'll have a log of who made it; why they made it; when they made it; and what the change was.
    • It makes it easier for you to collaborate when you're working with other people. For example, when people more or less simultaneously make potentially incompatible changes, the software will help you to identify and resolve those conflicts.
    • It can help you to recover from mistakes. If you make a change that later turns out to be an error, you can revert to an earlier version of one or more files. In fact, a really good revision control tool will even help you to efficiently figure out exactly when a problem was introduced.
    • It will help you to work simultaneously on, and manage the drift between, multiple versions of your project.

    Most of these reasons are equally valid, at least in theory, whether you're working on a project by yourself, or with a hundred other people.



    Revision: A revision (some seem to use it interchangeably with version while others seem to distinguish the two -- here, let us treat them as the same, for simplicity) is a state of a piece of information at a specific time that is a result of some changes to it e.g., if you modify the code and save the file, you have a new revision (or a new version) of that file.

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Revision control software are also known as Version Control Software (VCS), and by a few other names.

    Git is the most widely used RCS today. Other RCS tools include Mercurial, Subversion (SVN), Perforce, CVS (Concurrent Versions System), Bazaar, TFS (Team Foundation Server), and Clearcase.

    Github is a web-based project hosting platform for projects using Git for revision control. Other similar services include GitLab, BitBucket, and SourceForge.


    Repositories

    Can explain repositories

    The repository is the database that stores the revision history. Suppose you want to apply revision control on files in a directory called ProjectFoo. In that case, you need to set up a repo (short for repository) in the ProjectFoo directory, which is referred to as the working directory of the repo. For example, Git uses a hidden folder named .git inside the working directory, to store the database of the working directory's revision history.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    You can have multiple repos in your computer, each repo revision-controlling files of a different working directory, for examples, files of different projects.




    Saving History

    Can explain saving history

    Tracking and ignoring

    In a repo, you can specify which files to track and which files to ignore. For example, we can configure Git to ignore temporary files created during the build/test process, as it does not make sense to track their version history.

    Staging and committing

    Committing saves a snapshot of the current state of the tracked files in the revision control history. Such a snapshot is also called a commit (i.e. the noun).

    Commit (noun): a change (aka a revision) saved in the Git revision history.
    (verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    When ready to commit, you first add the specific changes you want to commit to a staging area. This intermediate step allows you to commit only some changes while saving other changes for a later commit.

    Stage (verb): Instructing Git to prepare a file for committing.




    Using History

    Can explain basic concepts of how RCS history is used

    RCS tools store the history of the working directory as a series of commits. This means you should commit after each change that you want the RCS to 'remember'.

    Each commit in a repo is a recorded point in the history of the project that is uniquely identified by an auto-generated hash e.g. a16043703f28e5b3dab95915f5c5e5bf4fdc5fc1.

    You can tag a specific commit with a more easily identifiable name e.g. v1.0.2.

    To see what changed between two points of the history, you can ask the RCS tool to diff the two commits in concern.

    To restore the state of the working directory at a point in the past, you can checkout the commit in concern. i.e., you can traverse the history of the working directory simply by checking out the commits you are interested in.


    Remote Repositories

    Can explain remote repositories

    Remote repositories are repos that are hosted on remote computers and allow remote access. They are especially useful for sharing the revision history of a codebase among team members of a multi-person project. They can also serve as a remote backup of your codebase.

    It is possible to set up your own remote repo on a server, but the easier option is to use a remote repo hosting service such as GitHub or BitBucket.

    You can clone a repo to create a copy of that repo in another location on your computer. The copy will even have the revision history of the original repo i.e., identical to the original repo. For example, you can clone a remote repo onto your computer to create a local copy of the remote repo.

    When you clone from a repo, the original repo is commonly referred to as the upstream repo. A repo can have multiple upstream repos. For example, let's say a repo repo1 was cloned as repo2 which was then cloned as repo3. In this case, repo1 and repo2 are upstream repos of repo3.

    You can pull (or fetch) from one repo to another, to receive new commits in the second repo, but only if the repos have a shared history. Let's say some new commits were added to the after you cloned it, and you would like to copy over those new commits to your own clone i.e., sync your clone with the upstream repo. In that case, you can pull from the upstream repo to your clone.

    You can push new commits in one repo to another repo which will copy the new commits onto the destination repo. Note that pushing to a repo requires you to have write-access to it. Furthermore, you can push between repos only if those repos have a shared history among them (i.e., one was created by copying the other at some point in the past).

    Cloning, pushing, and pulling/fetching can be done between two local repos too, although it is more common for them to involve a remote repo.

    A repo can work with any number of other repositories as long as they have a shared history e.g., repo1 can pull from (or push to) repo2 and repo3 if they have a shared history between them.

    A fork is a remote copy of a remote repo. As you know, cloning creates a local copy of a repo. In contrast, forking creates a remote copy of a repo hosted on remote service such as GitHub. This is particularly useful if you want to play around with a GitHub repo, but you don't have write permissions to it; you can simply fork the repo and do whatever you want with the fork as you are the owner of the fork.

    A pull request (PR for short) is a mechanism for contributing code to a remote repo i.e., "I'm requesting you to pull my proposed changes to your repo". It's feature provided by RCS platforms such as GitHub. For this to work, the two repos must have a shared history. The most common case is sending PRs from a fork to its repo.

    Here is a scenario that includes all the concepts introduced above (click inside the slide to advance the animation):


    Branching

    Can explain branching

    Branching is the process of evolving multiple versions of the software in parallel. For example, one team member can create a new branch and add an experimental feature to it while the rest of the team keeps working on another branch. Branches can be given names e.g. master, release, dev.

    A branch can be merged into another branch. Merging sometimes results in a new commit (called the merge commit) being created, to represent the cumulative changes done in the receiving branch as a result of the merge.

    Branching and merging

    Merge conflicts happen when you try to merge two branches that had changed the same part of the code and the RCS cannot decide which changes to keep. In those cases, you have to ‘resolve’ the conflicts manually.


    DRCS vs CRCS

    Can explain DRCS vs CRCS

    RCS can be done in two ways: the centralized way and the distributed way.

    Centralized RCS (CRCS for short) uses a central remote repo that is shared by the team. Team members interact directly with this central repository. Older RCS tools such as CVS and SVN support only this model.

    The centralized RCS approach without any local repos (e.g., CVS, SVN)

    Distributed RCS (DRCS for short, also known as Decentralized RCS) allows multiple remote/local repos working together. The workflow can vary from team to team. For example, every team member can have his/her own remote repository in addition to their own local repository, as shown in the diagram below. Git and Mercurial are some prominent RCS tools that support the distributed approach.

    The decentralized RCS approach


    Forking Flow

    Can explain forking workflow

    In the forking workflow, the 'official' version of the software is kept in a remote repo designated as the 'main repo'. All team members fork the main repo and create pull requests from their fork to the main repo.

    To illustrate how the workflow goes, let’s assume Jean wants to fix a bug in the code. Here are the steps:

    1. Jean creates a separate branch in her local repo and fixes the bug in that branch.
      Common mistake: Doing the proposed changes in the master branch -- if Jean does that, she will not be able to have more than one PR open at any time because any changes to the master branch will be reflected in all open PRs.
    2. Jean pushes the branch to her fork.
    3. Jean creates a pull request from that branch in her fork to the main repo.
    4. Other members review Jean’s pull request.
    5. If reviewers suggested any changes, Jean updates the PR accordingly.
    6. When reviewers are satisfied with the PR, one of the members (usually the team lead or a designated 'maintainer' of the main repo) merges the PR, which brings Jean’s code to the main repo.
    7. Other members, realizing there is new code in the upstream repo, sync their forks with the new upstream repo (i.e. the main repo). This is done by pulling the new code to their own local repo and pushing the updated code to their own fork. If there are unmerged branches in the local repo, they can be updated too e.g., by merging the new master branch to each of them.
      Possible mistake: Creating another 'reverse' PR from the team repo to the team member's fork to sync the member's fork with the merged code. PRs are meant to go from downstream repos to upstream repos, not in the other direction.

    One main benefit of this workflow is that it does not require most contributors to have write permissions to the main repository. Only those who are merging PRs need write permissions. -The main drawback of this workflow is the extra overhead of sending everything through forks.


    Feature Branch Flow

    Can explain feature branch flow

    Feature branch workflow is similar to forking workflow except there are no forks. Everyone is pushing/pulling from the same remote repo. The phrase feature branch is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the master branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.

    As this workflow require all team members to have write access to the repository,

    • it is better to protect the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.
    • it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.


    Centralized Flow

    Can explain centralized flow

    The centralized workflow is similar to the feature branch workflow except all changes are done in the master branch.


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +The main drawback of this workflow is the extra overhead of sending everything through forks.


    Feature Branch Flow

    Can explain feature branch flow

    Feature branch workflow is similar to forking workflow except there are no forks. Everyone is pushing/pulling from the same remote repo. The phrase feature branch is used because each new feature (or bug fix, or any other modification) is done in a separate branch and merged to the master branch when ready. Pull requests can still be created within the central repository, from the feature branch to the main branch.

    As this workflow require all team members to have write access to the repository,

    • it is better to protect the main branch using some mechanism, to reduce the risk of accidental undesirable changes to it.
    • it is not suitable for situations where the code contributors are not 'trusted' enough to be given write permission.


    Centralized Flow

    Can explain centralized flow

    The centralized workflow is similar to the feature branch workflow except all changes are done in the master branch.


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/revisionControl.page-vue-render.js b/se-book-adapted/chapters/revisionControl.page-vue-render.js index bcfea2fb0e..bad7a35886 100644 --- a/se-book-adapted/chapters/revisionControl.page-vue-render.js +++ b/se-book-adapted/chapters/revisionControl.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"revision-control"}},[_c('span',[_v("Revision control")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#revision-control","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/softwareEngineering.html b/se-book-adapted/chapters/softwareEngineering.html index ef39890343..a4c0a487cc 100644 --- a/se-book-adapted/chapters/softwareEngineering.html +++ b/se-book-adapted/chapters/softwareEngineering.html @@ -45,7 +45,7 @@ it becomes obsolete in terms of its concepts. But implementation of real products demands phasing and quantizing. The obsolescence of an implementation must be measured against other existing implementations, not against unrealized concepts. The challenge and the mission are to find real solutions to real problems on actual schedules with available resources.

    This then is programming, both a tar pit in which many efforts have floundered and a creative activity with joys -and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +and woes all its own. For many, the joys far outweigh the woes....


    Exercises:

    SE vs Civil Engineering


    Software vs Bridges


    Coding as a manufacturing activity


    List pros and cons of SE


    Which one of these is not included in Brook’s list of ‘Woes of the Craft’?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/softwareEngineering.page-vue-render.js b/se-book-adapted/chapters/softwareEngineering.page-vue-render.js index d267ccd19f..5fe3c31d69 100644 --- a/se-book-adapted/chapters/softwareEngineering.page-vue-render.js +++ b/se-book-adapted/chapters/softwareEngineering.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"software-engineering"}},[_c('span',[_v("Software Engineering")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#software-engineering","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/specifyingRequirements.html b/se-book-adapted/chapters/specifyingRequirements.html index 998fd8e3b8..514cfac02a 100644 --- a/se-book-adapted/chapters/specifyingRequirements.html +++ b/se-book-adapted/chapters/specifyingRequirements.html @@ -242,7 +242,7 @@ Use case: UC23 - Transfer Money
    Actor: User
    Preconditions: User is logged in.
    Guarantees:

    • Money will be deducted from the source account only if the transfer to the destination account is successful.
    • The transfer will not result in the account balance going below the minimum balance required.

    MSS:

    1. User chooses to transfer money.
    2. OBS requests for details for the transfer.
      -...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?



    Usage

    Can optimize the use of use cases

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases




    Glossary

    What

    Can explain glossary

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.


    Supplementary requirements

    What

    Can explain supplementary requirements

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +...


    Exercises:

    EZ-Link top-up use case


    LearnSys – reply to post use case


    Parts of a use case description


    What’s wrong with this use case?



    Usage

    Can optimize the use of use cases

    You can use actor generalization in use case diagrams using a symbol similar to that of UML notation for inheritance.

    In this example, actor Blogger can do all the use cases the actor Guest can do, as a result of the actor generalization relationship given in the diagram.

    Do not over-complicate use case diagrams by trying to include everything possible. A use case diagram is a brief summary of the use cases that is used as a starting point. Details of the use cases can be given in the use case descriptions.

    Some include ‘System’ as an actor to indicate that something is done by the system itself without being initiated by a user or an external system.

    The diagram below can be used to indicate that the system generates daily reports at midnight.

    However, others argue that only use cases providing value to an external user/system should be shown in the use case diagram. For example, they argue that view daily report should be the use case and generate daily report is not to be shown in the use case diagram because it is simply something the system has to do to support the view daily report use case.

    You are recommended to follow the latter view (i.e. not to use System as a user). Limit use cases for modeling behaviors that involve an external actor.

    UML is not very specific about the text contents of a use case. Hence, there are many styles for writing use cases. For example, the steps can be written as a continuous paragraph.

    Use cases should be easy to read. Note that there is no strict rule about writing all details of all steps or a need to use all the elements of a use case.

    There are some advantages of documenting system requirements as use cases:

    • Because they use a simple notation and plain English descriptions, they are easy for users to understand and give feedback.
    • They decouple user intention from mechanism (note that use cases should not include UI-specific details), allowing the system designers more freedom to optimize how a functionality is provided to a user.
    • Identifying all possible extensions encourages us to consider all situations that a software product might face during its operation.
    • Separating typical scenarios from special cases encourages us to optimize the typical scenarios.

    One of the main disadvantages of use cases is that they are not good for capturing requirements that do not involve a user interacting with the system. Hence, they should not be used as the sole means to specify requirements.


    Exercises:

    Advantages of use cases


    Statements about use cases




    Glossary

    What

    Can explain glossary

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    Here is a partial glossary from a variant of the Snakes and Ladders game:

    • Conditional square: A square that specifies a specific face value which a player has to throw before his/her piece can leave the square.
    • Normal square: a normal square does not have any conditions, snakes, or ladders in it.


    Supplementary requirements

    What

    Can explain supplementary requirements

    A supplementary requirements section can be used to capture requirements that do not fit elsewhere. Typically, this is where most Non-Functional Requirements will be listed.



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/specifyingRequirements.page-vue-render.js b/se-book-adapted/chapters/specifyingRequirements.page-vue-render.js index ad1e20282c..a4beb3264c 100644 --- a/se-book-adapted/chapters/specifyingRequirements.page-vue-render.js +++ b/se-book-adapted/chapters/specifyingRequirements.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"specifying-requirements"}},[_c('span',[_v("Specifying requirements")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#specifying-requirements","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/teamwork.html b/se-book-adapted/chapters/teamwork.html index a25db9fb0e..4243e1324a 100644 --- a/se-book-adapted/chapters/teamwork.html +++ b/se-book-adapted/chapters/teamwork.html @@ -15,7 +15,7 @@

    Teamwork

    Team Structures

    Can explain common team structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.


    Exercises:

    Which team structure is the most suitable for a school project?



    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Teamwork

    Team Structures

    Can explain common team structures

    Given below are three commonly used team structures in software development. Irrespective of the team structure, it is a good practice to assign roles and responsibilities to different team members so that someone is clearly in charge of each aspect of the project. In comparison, the ‘everybody is responsible for everything’ approach can result in more chaos and hence slower progress.

    Egoless team

    In this structure, every team member is equal in terms of responsibility and accountability. When any decision is required, consensus must be reached. This team structure is also known as a democratic team structure. This team structure usually finds a good solution to a relatively hard problem as all team members contribute ideas.

    However, the democratic nature of the team structure bears a higher risk of falling apart due to the absence of an authority figure to manage the team and resolve conflicts.

    Chief programmer team

    Frederick Brooks proposed that software engineers learn from the medical surgical team in an operating room. In such a team, there is always a chief surgeon, assisted by experts in other areas. Similarly, in a chief programmer team structure, there is a single authoritative figure, the chief programmer. Major decisions, e.g. system architecture, are made solely by him/her and obeyed by all other team members. The chief programmer directs and coordinates the effort of other team members. When necessary, the chief will be assisted by domain specialists e.g. business specialists, database experts, network technology experts, etc. This allows individual group members to concentrate solely on the areas in which they have sound knowledge and expertise.

    The success of such a team structure relies heavily on the chief programmer. Not only must he/she be a superb technical hand, he/she also needs good managerial skills. Under a suitably qualified leader, such a team structure is known to produce successful work.

    Strict hierarchy team

    At the opposite extreme of an egoless team, a strict hierarchy team has a strictly defined organization among the team members, reminiscent of the military or a bureaucratic government. Each team member only works on his/her assigned tasks and reports to a single “boss”.

    In a large, resource-intensive, complex project, this could be a good team structure to reduce communication overhead.


    Exercises:

    Which team structure is the most suitable for a school project?



    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/teamwork.page-vue-render.js b/se-book-adapted/chapters/teamwork.page-vue-render.js index 4def93f328..012a61976e 100644 --- a/se-book-adapted/chapters/teamwork.page-vue-render.js +++ b/se-book-adapted/chapters/teamwork.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"teamwork"}},[_c('span',[_v("Teamwork")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teamwork","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/test.html b/se-book-adapted/chapters/test.html index 4f2b401dd7..51f047ccc4 100644 --- a/se-book-adapted/chapters/test.html +++ b/se-book-adapted/chapters/test.html @@ -12,7 +12,7 @@ const baseUrl = '/website' - + diff --git a/se-book-adapted/chapters/test.page-vue-render.js b/se-book-adapted/chapters/test.page-vue-render.js index ef02548580..d68ea55640 100644 --- a/se-book-adapted/chapters/test.page-vue-render.js +++ b/se-book-adapted/chapters/test.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('p',[_v("1")]),_v(" "),_c('p',[_v("3")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/testCaseDesign.html b/se-book-adapted/chapters/testCaseDesign.html index 1ca3f3dfd5..9e4564e134 100644 --- a/se-book-adapted/chapters/testCaseDesign.html +++ b/se-book-adapted/chapters/testCaseDesign.html @@ -26,7 +26,7 @@ [“F”]
    [“A”, “D”, “X”]

    No specific boundary
    No specific boundary
    -No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space



    Combining test inputs

    Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    Test Input Combination Strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    Heuristic: Each Valid Input at Least Once in a Positive Test Case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    Heuristic: Test Invalid Inputs Individually Before Combining Them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method




    More

    Testing Based on Use Cases

    Can explain test case design for use case based testing

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.



    Recap

    Exercises

    Can combine test case design techniques


    Exercises:

    Matric numbers


    isValidDate


    Dispatch resources


    transferTable


    add(Item)


    setWife


    Pre-Release Game


    True or False?


    Design test cases for the day parameter




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +No specific boundary

    [non-empty Stack]
    (assuming a fixed size stack)

    Stack with: no elements, one element, two elements, no empty spaces, only one empty space



    Combining test inputs

    Why

    Can explain the need for strategies to combine test inputs

    An SUT can take multiple inputs. You can select values for each input (using equivalence partitioning, boundary value analysis, or some other technique).

    An SUT that takes multiple inputs and some values chosen for each input:

    • Method to test: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test:
      Input Valid values to test Invalid values to test
      participation 0, 1, 19, 20 21, 22
      projectGrade A, B, C, D, F
      isAbsent true, false
      examScore 0, 1, 69, 70, 71, 72

    Testing all possible combinations is effective but not efficient. If you test all possible combinations for the above example, you need to test 6x5x2x6=360 cases. Doing so has a higher chance of discovering bugs (i.e. effective) but the number of test cases will be too high (i.e. not efficient). Therefore, you need smarter ways to combine test inputs that are both effective and efficient.


    Test Input Combination Strategies

    Can explain some basic test input combination strategies

    Given below are some basic strategies for generating a set of test cases by combining multiple test inputs.

    Let's assume the SUT has the following three inputs and you have selected the given values for testing:

    SUT: foo(char p1, int p2, boolean p3)

    Values to test:

    Input Values
    p1 a, b, c
    p2 1, 2, 3
    p3 T, F

    The all combinations strategy generates test cases for each unique combination of test inputs.

    This strategy generates 3x3x2=18 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 a 1 F
    3 a 2 T
    ... ... ... ...
    18 c 3 F

    The at least once strategy includes each test input at least once.

    This strategy generates 3 test cases.

    Test Case p1 p2 p3
    1 a 1 T
    2 b 2 F
    3 c 3 VV/IV

    VV/IV = Any Valid Value / Any Invalid Value

    The all pairs strategy creates test cases so that for any given pair of inputs, all combinations between them are tested. It is based on the observation that a bug is rarely the result of more than two interacting factors. The resulting number of test cases is lower than the all combinations strategy, but higher than the at least once approach.

    This strategy generates 9 test cases:

    See steps


    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 T
    3 a 3 F
    4 b 1 F
    5 b 2 T
    6 b 3 F
    7 c 1 T
    8 c 2 F
    9 c 3 T

    A variation of this strategy is to test all pairs of inputs but only for inputs that could influence each other.

    Testing all pairs between p1 and p3 only while ensuring all p2 values are tested at least once:

    Test Case p1 p2 p3
    1 a 1 T
    2 a 2 F
    3 b 3 T
    4 b VV/IV F
    5 c VV/IV T
    6 c VV/IV F

    The random strategy generates test cases using one of the other strategies and then picks a subset randomly (presumably because the original set of test cases is too big).

    There are other strategies that can be used too.


    Heuristic: Each Valid Input at Least Once in a Positive Test Case

    Can apply heuristic ‘each valid input at least once in a positive test case’

    Consider the following scenario.

    SUT: printLabel(String fruitName, int unitPrice)

    Selected values for fruitName (invalid values are underlined):

    Values Explanation
    Apple Label format is round
    Banana Label format is oval
    Cherry Label format is square
    Dog Not a valid fruit

    Selected values for unitPrice:

    Values Explanation
    1 Only one digit
    20 Two digits
    0 Invalid because 0 is not a valid price
    -1 Invalid because negative prices are not allowed

    Suppose these are the test cases being considered.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    3 Cherry 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    It looks like the test cases were created using the at least once strategy. After running these tests, can you confirm that the square-format label printing is done correctly?

    • Answer: No.
    • Reason: Cherry -- the only input that can produce a square-format label -- is in a negative test case which produces an error message instead of a label. If there is a bug in the code that prints labels in square-format, these tests cases will not trigger that bug.

    In this case, a useful heuristic to apply is each valid input must appear at least once in a positive test case. Cherry is a valid test input and you must ensure that it appears at least once in a positive test case. Here are the updated test cases after applying that heuristic.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 Dog -1 Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value


    Heuristic: Test Invalid Inputs Individually Before Combining Them

    Can apply heuristic ‘test invalid inputs individually before combining them’

    To verify the SUT is handling a certain invalid input correctly, it is better to test that invalid input without combining it with other invalid inputs. For example, consider the test case 4 of test cases designed in [Heuristic: each valid input at least once in a positive test case]. After running that test case, can you be sure that the error message “invalid fruit” is caused by the invalid fruitName Dog?

    • Answer: No
    • Reason: Because it could have been (incorrectly) triggered by the other invalid unitPrice of -1 in that test case, due to a bug in the code.

    Therefore, if that test case was intended to verify that the invalid fruitName Dog triggers the "invalid fruit" error message, it is better not to include the invalid unitPrice -1 in that test case at the same time. If the invalid value -1 needs to be tested, we should test it in a separate test case.

    After applying the above insight to our running example, you get the following test cases.

    Case fruitName unitPrice Expected
    1 Apple 1 Print round label
    2 Banana 20 Print oval label
    2.1 Cherry VV Print square label
    3 VV 0 Error message “invalid price”
    4 VV -1 Error message “invalid price"
    4.1 Dog VV Error message “invalid fruit"

    VV/IV = Any Invalid or Valid Value VV = Any Valid Value

    This is not to say never have more than one invalid input in a test case. In fact, an SUT might work correctly when only one invalid input is given but not when a certain combination of multiple invalid inputs is given. Hence, it is still useful to have test cases with multiple invalid inputs, after you already have confirmed that the SUT works when only one invalid input is given.

    Test invalid inputs individually before combining them is the heuristic we learned here. As a test case with multiple invalid inputs by itself does not confirm that the SUT works for each of those invalid inputs, you are better off testing the SUT with one-invalid-input-at-a-time first, and if you can afford more test cases, also testing with combinations of invalid inputs.


    Exercises:

    Can define test cases precisely



    Mix

    Can apply multiple test input combination techniques together

    Consider the calculateGrade scenario given below:

    • SUT: calculateGrade(participation, projectGrade, isAbsent, examScore)
    • Values to test: invalid values are underlined
      • participation: 0, 1, 19, 20, 21, 22
      • projectGrade: A, B, C, D, F
      • isAbsent: true, false
      • examScore: 0, 1, 69, 70, 71, 72

    To get the first cut of test cases, let’s apply the at least once strategy.

    Test cases for calculateGrade V1

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV/IV 69 ...
    4 20 D VV/IV 70 ...
    5 21 F VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV/IV = Any Valid or Invalid Value, Err Msg = Error Message

    Next, let’s apply the each valid input at least once in a positive test case heuristic. Test case 5 has a valid value for projectGrade=F that doesn't appear in any other positive test case. Let's replace test case 5 with 5.1 and 5.2 to rectify that.

    Test cases for calculateGrade V2

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV/IV VV/IV 71 Err Msg
    6 22 VV/IV VV/IV 72 Err Msg

    VV = Any Valid Value VV/IV = Any Valid or Invalid Value

    Next, you have to apply the no more than one invalid input in a test case heuristic. Test cases 5.2 and 6 don't follow that heuristic. Let's rectify the situation as follows:

    Test cases for calculateGrade V3

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C VV 69 ...
    4 20 D VV 70 ...
    5.1 VV F VV VV ...
    5.2 21 VV VV VV Err Msg
    5.3 22 VV VV VV Err Msg
    6.1 VV VV VV 71 Err Msg
    6.2 VV VV VV 72 Err Msg

    Next, you can assume that there is a dependency between the inputs examScore and isAbsent such that an absent student can only have examScore=0. To cater for the hidden invalid case arising from this, you can add a new test case where isAbsent=true and examScore!=0. In addition, test cases 3-6.2 should have isAbsent=false so that the input remains valid.

    Test cases for calculateGrade V4

    Case No. participation projectGrade isAbsent examScore Expected
    1 0 A true 0 ...
    2 1 B false 1 ...
    3 19 C false 69 ...
    4 20 D false 70 ...
    5.1 VV F false VV ...
    5.2 21 VV false VV Err Msg
    5.3 22 VV false VV Err Msg
    6.1 VV VV false 71 Err Msg
    6.2 VV VV false 72 Err Msg
    7 VV VV true !=0 Err Msg

    Exercises:

    Statements about test input combinations


    Combine test inputs for the consume method




    More

    Testing Based on Use Cases

    Can explain test case design for use case based testing

    Use cases can be used for system testing and acceptance testing. For example, the main success scenario can be one test case while each variation (due to extensions) can form another test case. However, note that use cases do not specify the exact data entered into the system. Instead, it might say something like user enters his personal data into the system. Therefore, the tester has to choose data by considering equivalence partitions and boundary values. The combinations of these could result in one use case producing many test cases.

    To increase the E&E of testing, high-priority use cases are given more attention. For example, a scripted approach can be used to test high-priority test cases, while an exploratory approach is used to test other areas of concern that could emerge during testing.



    Recap

    Exercises

    Can combine test case design techniques


    Exercises:

    Matric numbers


    isValidDate


    Dispatch resources


    transferTable


    add(Item)


    setWife


    Pre-Release Game


    True or False?


    Design test cases for the day parameter




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/testCaseDesign.page-vue-render.js b/se-book-adapted/chapters/testCaseDesign.page-vue-render.js index cad412641c..45c0d3d94d 100644 --- a/se-book-adapted/chapters/testCaseDesign.page-vue-render.js +++ b/se-book-adapted/chapters/testCaseDesign.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"test-case-design"}},[_c('span',[_v("Test case design")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#test-case-design","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/testing.html b/se-book-adapted/chapters/testing.html index 34a7b8f805..c1d8d43a9a 100644 --- a/se-book-adapted/chapters/testing.html +++ b/se-book-adapted/chapters/testing.html @@ -906,7 +906,7 @@ (Uncle Bob = Robert C. Martin, the author of Clean Code)
  • Let’s play TDD screencasts by James Shore: [ episode 1 ] [ episode 2 ] -[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?


  • [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +[ the rest ]
  • TDD: Is There Really Any Debate Any Longer?


  • [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/testing.page-vue-render.js b/se-book-adapted/chapters/testing.page-vue-render.js index 9935c2f7d0..679663f24c 100644 --- a/se-book-adapted/chapters/testing.page-vue-render.js +++ b/se-book-adapted/chapters/testing.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"testing"}},[_c('span',[_v("Testing")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#testing","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/chapters/uml.html b/se-book-adapted/chapters/uml.html index 1ace8f6372..71cf66d182 100644 --- a/se-book-adapted/chapters/uml.html +++ b/se-book-adapted/chapters/uml.html @@ -532,7 +532,7 @@

    Alternative Paths

    Can interpret sequence diagrams with alternative paths

    UML uses alt frames to indicate alternative paths.

    Notation:

    Minefield calls the Cell#setMine method if the cell is supposed to be a mined cell, and calls the Cell:setMineCount(...) method otherwise.

    No more than one alternative partitions be executed in an alt frame. That is, it is acceptable for none of the alternative partitions to be executed but it is not acceptable for multiple partitions to be executed.


    Optional Paths

    Can interpret sequence diagrams with optional paths

    UML uses opt frames to indicate optional paths.

    Notation:

    Logic#markCellAt(...) calls Timer#start() only if it is the first move of the player.


    Parallel Paths

    Can interpret sequence diagrams with parallel paths

    UML uses par frames to indicate parallel paths.

    Notation:

    Logic is calling methods CloudServer#poll() and LocalData#poll() in parallel.

    If you show parallel paths in a sequence diagram, the corresponding Java implementation is likely to be multi-threaded because a normal Java program cannot do multiple things at the same time.


    Reference Frames

    Can interpret sequence diagrams with reference frames

    UML uses ref frame to allow a segment of the interaction to be omitted and shown as a separate sequence diagram. Reference frames help you to break complicated sequence diagrams into multiple parts or simply to omit details you are not interested in showing.

    Notation:

    The details of the get minefield appearance interactions have been omitted from the diagram.

    Those details are shown in a separate sequence diagram given below.


    Calls to Static Methods

    Can show calls to static methods

    Method calls to static (i.e., class-level) methods are received by the class itself, not an instance of that class. You can use <<class>> to show that a participant is the class itself.

    In this example, m calls the static method Person.getMaxAge() and also the setAge() method of a Person object p.

    Here is the Person class, for reference:


    Minimal Notation

    Can interpret sequence diagrams with minimal notation

    To reduce clutter, optional elements (e.g, activation bars, return arrows) may be omitted if the omission does not result in ambiguities or loss of . Informal operation descriptions such as those given in the example below can be used, if more precise details are not required for the task at hand.

    A minimal sequence diagram

    If method parameters don't matter to the purpose of the sequence diagram, you can omit them using ... e.g., use foo(...) instead of foo(int size, double weight).



    Object diagrams

    Introduction

    Can explain/identify object diagrams

    An object diagram shows an object structure at a given point of time.

    An example object diagram:


    Objects

    Can draw UML objects

    Notation:

    Notes:

    • The class name and object name are underlined e.g. car1:Car.
    • objectName:ClassName is meant to say 'an instance of ClassName identified as objectName'.
    • Unlike classes, there is no compartment for methods.
    • Attributes compartment can be omitted if it is not relevant to the purpose of the diagram.
    • Object name can be omitted too e.g. :Car which is meant to say 'an unnamed instance of a Car object'.

    Some example objects:


    Exercises:

    Draw Book object



    Associations

    Can interpret simple associations among objects

    A solid line indicates an association between two objects.

    An example object diagram showing two associations:



    Activity diagrams

    Introduction

    What

    Can explain activity diagrams

    UML  activity diagrams (AD) can model workflows.  Flow charts are another type of diagram that can model workflows. Activity diagrams are the UML equivalent of flow charts.

    An example activity diagram:

    [source:wikipeida]



    Basic notations

    Linear Paths

    Can interpret linear paths in activity diagrams

    An activity diagram (AD) captures an activity through the actions and control flows that make up the activity.

    • An action is a single step in an activity. It is shown as a rectangle with rounded corners.
    • A control flow shows the flow of control from one action to the next. It is shown by drawing a line with an arrow-head to show the direction of the flow.

    Note the slight difference between the start node and the end node which represent the start and the end of the activity, respectively.

    This activity diagram shows the action sequence of the activity a passenger rides the bus:


    Exercises:

    Which activity diagrams are correct?



    Alternate Paths

    Can interpret alternate paths in activity diagrams

    A branch node shows the start of alternate paths. Each control flow exiting a branch node has a guard condition: a boolean condition that should be true for execution to take that path. Exactly one of the guard conditions should be true at any given branch node.

    A merge node shows the end of alternate paths.

    Both branch nodes and merge nodes are diamond shapes. Guard conditions must be in square brackets.

    The AD below shows alternate paths involved in the workflow of the activity shop for product:

    Some acceptable simplifications (by convention):

    • Omitting the merge node if it doesn't cause any ambiguities.
    • Multiple arrows can start from the same corner of a branch node.
    • Omitting the [Else] condition.

    The AD below illustrates the simplifications mentioned above:


    Exercises:

    Which activity diagrams are correct?



    Parallel Paths

    Can interpret parallel paths in activity diagrams

    Fork nodes indicate the start of flows of control.

    Join nodes indicate the end of parallel paths.

    Both have the same notation: a bar.

    In a , execution along all parallel paths should be complete before the execution can start on the outgoing control flow of the join.

    In this activity diagram (from an online shop website) the actions User browses products and System records browsing data happen in parallel. Both of them need to finish before the log out action can take place.


    Exercises:

    Which activity diagrams are correct?


    Which sequence of actions are supported?



    Rakes

    Can use rakes in activity diagrams

    The rake notation is used to indicate that a part of the activity is given as a separate diagram.

    Here is the AD for a game of ‘Snakes and Ladders’.

    The rake symbol (in the Move piece action above) is used to show that the action is described in another subsidiary activity diagram elsewhere. That diagram is given below.


    Swimlanes

    Can explain swimlanes in activity diagrams

    It is possible to partition an activity diagram to show who is doing which action. Such partitioned activity diagrams are sometime called swimlane diagrams.

    A simple example of a swimlane diagram:




    Notes

    Notes

    Can use UML notes

    UML notes can augment UML diagrams with additional information. These notes can be shown connected to a particular element in the diagram or can be shown without a connection. The diagram below shows examples of both.

    Example:


    Constraints

    Can specify constraints in UML diagrams

    A constraint can be given inside a note, within curly braces. Natural language or a formal notation such as OCL (Object Constraint Language) may be used to specify constraints.

    Example:



    Miscellaneous

    Object vs Class Diagrams

    Can distinguish between class diagrams and object diagrams

    Compared to the notation for class diagrams, object diagrams differ in the following ways:

    • Show objects instead of classes:
      • Instance name may be shown
      • There is a : before the class name
      • Instance and class names are underlined
    • Methods are omitted
    • Multiplicities are omitted. Reason: an association line in an object diagram represents a connection to exactly one object (i.e., the multiplicity is always 1).

    Furthermore, multiple object diagrams can correspond to a single class diagram.

    Both object diagrams are derived from the same class diagram shown earlier. In other words, each of these object diagrams shows ‘an instance of’ the same class diagram.

    When the class diagram has an inheritance relationship, the object diagram should show either an object of the parent class or the child class, but not both.

    Suppose Employee is a child class of the Person class. The class diagram will be as follows:

    Now, how do you show an Employee object named jake?

    • This is not correct, as there should be only one object.

    • This is OK.

    • This is OK, as jake is a Person too. -That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?




    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +That is, we can show the parent class instead of the child class if the child class doesn't matter to the purpose of the diagram (i.e., the reader of this diagram will not need to know that jake is in fact an Employee).

    Association labels/roles can be omitted unless they add value (e.g., showing them is useful if there are multiple associations between the two classes in concern -- otherwise you wouldn't know which association the object diagram is showing)

    Consider this class diagram and the object diagram:

    We can clearly see that both Adam and Eve lives in hall h1 (i.e., OK to omit the association label lives in) but we can't see if History is Adam's major or his minor (i.e., the diagram should have included either an association label or a role there). In contrast, we can see Eve is an English major.


    Exercises:

    Which class diagrams match the object diagram?




    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/chapters/uml.page-vue-render.js b/se-book-adapted/chapters/uml.page-vue-render.js index 882eaac90d..82aa243d20 100644 --- a/se-book-adapted/chapters/uml.page-vue-render.js +++ b/se-book-adapted/chapters/uml.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('p',[_c('span',{staticClass:"dimmed"},[_c('strong',[_c('spa with(this){return _c('div',{attrs:{"id":"title"}},[_c('div',[_c('h1',{attrs:{"id":"uml"}},[_c('span',[_v("UML")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#uml","onclick":"event.stopPropagation()"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/common/definitions.html b/se-book-adapted/common/definitions.html index 9e11bfcebd..3ffd1b8807 100644 --- a/se-book-adapted/common/definitions.html +++ b/se-book-adapted/common/definitions.html @@ -16,7 +16,7 @@

    Definitions

    A

    Abstraction is a technique for dealing with complexity. It works by establishing a level of complexity we are interested in, and suppressing the more complex details below that level.

    Actor: An actor (in a use case) is a role played by a user. An actor can be a human or another system. Actors are not part of the system; they reside outside the system.

    Architecture: The high level structures of a software system, the discipline of creating such structures, and the documentation of these structures. These structures are needed to reason about the software system. Each structure comprises software elements, relations among them, and properties of both elements and relations. The architecture of a software system is a metaphor, analogous to the architecture of a building.

    B

    Brainstorming: A group activity designed to generate a large number of diverse and creative ideas for the solution of a problem.

    Brooks' law: Adding people to a late project will make it later. -- Fred Brooks (author of The Mythical Man-Month)

    C

    Client component/method/object: The component/method/object that is interacting with a given code.

    CLI application: An application that has a Command Line Interface. i.e. user interacts with the app by typing in commands.

    Commit (noun): a change (aka a revision) saved in the Git revision history.
    -(verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    Coupling: The degree of interdependence between software modules; a measure of how closely connected two routines or modules are; the strength of the relationships between modules.

    D

    Dependency inversion principle (DIP):

    1. High-level modules should not depend on low-level modules. Both should depend on abstractions.
    2. Abstractions should not depend on details. Details should depend on abstractions.

    Design pattern: An elegant reusable solution to a commonly recurring problem within a given context in software design.

    Domain expert: An expert of a discipline to which the product is connected e.g., for a software used for Accounting, a domain expert is someone who is an expert of Accounting.

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    Dynamic binding (): a mechanism where method calls in code are at , rather than at compile time.

    E

    Enterprise application: ‘enterprise applications’ refer to software applications used by organizations and therefore have to meet much higher demands (such as in scalability, security, performance, and robustness) than software meant for individual use.

    Exception:

    The term exception is shorthand for the phrase "exceptional event." An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. –- Java Tutorial (Oracle Inc.)

    Equivalence partition (aka equivalence class): A group of test inputs that are likely to be processed by the SUT in the same way.

    F

    Feature list: A list of features of a product grouped according to some criteria such as aspect, priority, order of delivery, etc.

    Focus groups: A kind of informal interview within an interactive group setting.

    G

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    I

    Interface segregation principle (ISP): No client should be forced to depend on methods it does not use.

    L

    Law of Demeter (LoD):

    • An object should have limited knowledge of another object.
    • An object should only interact with objects that are closely related to it.

    Also known as

    • Don’t talk to strangers.
    • Principle of least knowledge

    Liskov substitution principle (LSP): Derived classes must be substitutable for their base classes. -- proposed by Barbara Liskov

    O

    Open-closed principle (OCP): A module should be open for extension but closed for modification. That is, modules should be written so that they can be extended, without requiring them to be modified. -- proposed by Bertrand Meyer

    P

    Pair programming:

    Pair programming is an agile software development technique in which two programmers work together at one workstation. One, the driver, writes code while the other, the observer or navigator, reviews each line of code as it is typed in. The two programmers switch roles frequently. [source: Wikipedia]

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    R

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    S

    Separation of concerns principle (SoC): To achieve better modularity, separate the code into distinct sections, such that each section addresses a separate concern. -- Proposed by Edsger W. Dijkstra

    Single responsibility principle (SRP): A class should have one, and only one, reason to change. -- Robert C. Martin

    Software engineering: Software Engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software" -- IEEE Standard Glossary of Software Engineering Terminology

    Stage (verb): Instructing Git to prepare a file for committing.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static binding (aka early binding): When a method call is resolved at compile time.

    Stub: A stub has the same interface as the component it replaces, but its implementation is so simple that it is unlikely to have any bugs. It mimics the responses of the component, but only for a limited set of predetermined inputs. That is, it does not know how to respond to any other inputs. Typically, these mimicked responses are hard-coded in the stub rather than computed or retrieved from elsewhere, e.g. from a database.

    SUT: Software Under Test

    T

    Testing: Operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component. –- source: IEEE

    Type signature: The type signature of an operation is the type sequence of the parameters. The return type and parameter names are not part of the type signature. However, the parameter order is significant.

    Example:

    Method Type Signature
    int add(int X, int Y) (int, int)
    void add(int A, int B) (int, int)
    void m(int X, double Y) (int, double)
    void m(double X, int Y) (double, int)

    U

    Unified Modeling Language (UML) is a graphical notation to describe various aspects of a software system. UML is the brainchild of three software modeling specialists James Rumbaugh, Grady Booch and Ivar Jacobson (also known as the Three Amigos). Each of them had developed their own notation for modeling software systems before joining forces to create a unified modeling language (hence, the term ‘Unified’ in UML). UML is currently the most commonly used modeling notation used in the software industry.

    Use case: A description of a set of sequences of actions, including variants, that a system performs to yield an observable result of value to an actor [ 📖 : ].

    User story: User stories are short, simple descriptions of a feature told from the perspective of the person who desires the new capability, usually a user or customer of the system. [Mike Cohn]

    User story format: As a {user type/role} I can {function} so that {benefit}

    W

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    Y

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +(verb): the act of creating a commit i.e., saving a change in the working directory into the Git revision history.

    Coupling: The degree of interdependence between software modules; a measure of how closely connected two routines or modules are; the strength of the relationships between modules.

    D

    Dependency inversion principle (DIP):

    1. High-level modules should not depend on low-level modules. Both should depend on abstractions.
    2. Abstractions should not depend on details. Details should depend on abstractions.

    Design pattern: An elegant reusable solution to a commonly recurring problem within a given context in software design.

    Domain expert: An expert of a discipline to which the product is connected e.g., for a software used for Accounting, a domain expert is someone who is an expert of Accounting.

    DRY (Don't Repeat Yourself) principle: Every piece of knowledge must have a single, unambiguous, authoritative representation within a system. -- The Pragmatic Programmer, by Andy Hunt and Dave Thomas

    Dynamic binding (): a mechanism where method calls in code are at , rather than at compile time.

    E

    Enterprise application: ‘enterprise applications’ refer to software applications used by organizations and therefore have to meet much higher demands (such as in scalability, security, performance, and robustness) than software meant for individual use.

    Exception:

    The term exception is shorthand for the phrase "exceptional event." An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program's instructions. –- Java Tutorial (Oracle Inc.)

    Equivalence partition (aka equivalence class): A group of test inputs that are likely to be processed by the SUT in the same way.

    F

    Feature list: A list of features of a product grouped according to some criteria such as aspect, priority, order of delivery, etc.

    Focus groups: A kind of informal interview within an interactive group setting.

    G

    Glossary: A glossary serves to ensure that all stakeholders have a common understanding of the noteworthy terms, abbreviations, acronyms etc.

    I

    Interface segregation principle (ISP): No client should be forced to depend on methods it does not use.

    L

    Law of Demeter (LoD):

    • An object should have limited knowledge of another object.
    • An object should only interact with objects that are closely related to it.

    Also known as

    • Don’t talk to strangers.
    • Principle of least knowledge

    Liskov substitution principle (LSP): Derived classes must be substitutable for their base classes. -- proposed by Barbara Liskov

    O

    Open-closed principle (OCP): A module should be open for extension but closed for modification. That is, modules should be written so that they can be extended, without requiring them to be modified. -- proposed by Bertrand Meyer

    P

    Pair programming:

    Pair programming is an agile software development technique in which two programmers work together at one workstation. One, the driver, writes code while the other, the observer or navigator, reviews each line of code as it is typed in. The two programmers switch roles frequently. [source: Wikipedia]

    Prototype: A prototype is a mock up, a scaled down version, or a partial system constructed

    • to get users’ feedback.
    • to validate a technical concept (a "proof-of-concept" prototype).
    • to give a preview of what is to come, or to compare multiple alternatives on a small scale before committing fully to one alternative.
    • for early field-testing under controlled conditions.

    Polymorphism:

    The ability of different objects to respond, each in its own way, to identical messages is called polymorphism. -- Object-Oriented Programming with Objective-C, Apple

    R

    RCS: Revision control software are the software tools that automate the process of Revision Control i.e. managing revisions of software artifacts.

    Repository (repo for short): The database of the history of a directory being tracked by an RCS software (e.g. Git).

    S

    Separation of concerns principle (SoC): To achieve better modularity, separate the code into distinct sections, such that each section addresses a separate concern. -- Proposed by Edsger W. Dijkstra

    Single responsibility principle (SRP): A class should have one, and only one, reason to change. -- Robert C. Martin

    Software engineering: Software Engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software" -- IEEE Standard Glossary of Software Engineering Terminology

    Stage (verb): Instructing Git to prepare a file for committing.

    Stakeholder: An individual or an organization that is involved or potentially affected by the software project. e.g. users, sponsors, developers, interest groups, government agencies, etc.

    Static analysis: Static analysis is the analysis of code without actually executing the code.

    Static binding (aka early binding): When a method call is resolved at compile time.

    Stub: A stub has the same interface as the component it replaces, but its implementation is so simple that it is unlikely to have any bugs. It mimics the responses of the component, but only for a limited set of predetermined inputs. That is, it does not know how to respond to any other inputs. Typically, these mimicked responses are hard-coded in the stub rather than computed or retrieved from elsewhere, e.g. from a database.

    SUT: Software Under Test

    T

    Testing: Operating a system or component under specified conditions, observing or recording the results, and making an evaluation of some aspect of the system or component. –- source: IEEE

    Type signature: The type signature of an operation is the type sequence of the parameters. The return type and parameter names are not part of the type signature. However, the parameter order is significant.

    Example:

    Method Type Signature
    int add(int X, int Y) (int, int)
    void add(int A, int B) (int, int)
    void m(int X, double Y) (int, double)
    void m(double X, int Y) (double, int)

    U

    Unified Modeling Language (UML) is a graphical notation to describe various aspects of a software system. UML is the brainchild of three software modeling specialists James Rumbaugh, Grady Booch and Ivar Jacobson (also known as the Three Amigos). Each of them had developed their own notation for modeling software systems before joining forces to create a unified modeling language (hence, the term ‘Unified’ in UML). UML is currently the most commonly used modeling notation used in the software industry.

    Use case: A description of a set of sequences of actions, including variants, that a system performs to yield an observable result of value to an actor [ 📖 : ].

    User story: User stories are short, simple descriptions of a feature told from the perspective of the person who desires the new capability, usually a user or customer of the system. [Mike Cohn]

    User story format: As a {user type/role} I can {function} so that {benefit}

    W

    Working directory: the root directory revision-controlled by Git (e.g., the directory in which the repo was initialized).

    Y

    YAGNI (You Aren't Gonna Need It!) Principle: Do not add code simply because ‘you might need it in the future’.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/common/definitions.page-vue-render.js b/se-book-adapted/common/definitions.page-vue-render.js index 484f641d69..bbaaa63673 100644 --- a/se-book-adapted/common/definitions.page-vue-render.js +++ b/se-book-adapted/common/definitions.page-vue-render.js @@ -191,6 +191,6 @@ with(this){return _c('h2',{attrs:{"id":"y"}},[_v("Y"),_c('a',{staticClass:"fa fa with(this){return _c('div',[_c('p',[_c('strong',[_v("YAGNI (You Aren't Gonna Need It!) Principle")]),_v(": Do not add code simply because ‘you might need it in the future’.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/common/exercises.html b/se-book-adapted/common/exercises.html index 8601a1e0a0..c33a34ca41 100644 --- a/se-book-adapted/common/exercises.html +++ b/se-book-adapted/common/exercises.html @@ -15,7 +15,7 @@

    Combined Exercises

    Here are some exercises that combine multiple topics.

    Choose the correct statement about requirements.

    Choose the correct statement


    Class Diagrams vs Object Diagrams vs Sequence Diagrams

    Choose the incorrect statement.


    Which one of these is the most useful to describe a workflow?

    Which one of these is the most useful to model a workflow?


    Pick the odd one out of these project management tools/techniques.

    Pick the odd one out.


    Choose the least correct statement about principles and patterns.

    Choose the least correct statement


    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +

    Combined Exercises

    Here are some exercises that combine multiple topics.

    Choose the correct statement about requirements.

    Choose the correct statement


    Class Diagrams vs Object Diagrams vs Sequence Diagrams

    Choose the incorrect statement.


    Which one of these is the most useful to describe a workflow?

    Which one of these is the most useful to model a workflow?


    Pick the odd one out of these project management tools/techniques.

    Pick the odd one out.


    Choose the least correct statement about principles and patterns.

    Choose the least correct statement


    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/common/exercises.page-vue-render.js b/se-book-adapted/common/exercises.page-vue-render.js index 693a4efdcc..55bf7f982e 100644 --- a/se-book-adapted/common/exercises.page-vue-render.js +++ b/se-book-adapted/common/exercises.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"sticky":"" with(this){return _c('h2',{attrs:{"id":"combined-exercises"}},[_v("Combined Exercises"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#combined-exercises","onclick":"event.stopPropagation()"}})])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/index.html b/se-book-adapted/index.html index 875f244ced..aa734d0560 100644 --- a/se-book-adapted/index.html +++ b/se-book-adapted/index.html @@ -15,7 +15,7 @@
    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +
    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/index.page-vue-render.js b/se-book-adapted/index.page-vue-render.js index c20ef53355..414418d98e 100644 --- a/se-book-adapted/index.page-vue-render.js +++ b/se-book-adapted/index.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-b with(this){return _c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/chapters/cppToJava.html"}},[_v("C++ to Java")]),_v(" "),_c('a',{attrs:{"href":"/website/se-book-adapted/chapters-printable/cppToJava-printable.html"}},[_c('span',[_c('span',{staticClass:"glyphicon glyphicon-print",attrs:{"aria-hidden":"true"}})])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/projectDuke/index.html"}},[_v("Project Duke")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/common/exercises.html"}},[_v("Combined Exercises")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/website/se-book-adapted/common/definitions.html"}},[_v("List of Definitions")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/print.html b/se-book-adapted/print.html index 76f063cd12..28997835ba 100644 --- a/se-book-adapted/print.html +++ b/se-book-adapted/print.html @@ -7657,7 +7657,7 @@ (1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo.
    If there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new master branch to each of them.
    (2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.
  • Some alternatives mechanisms to achieve the same can be found in this GitHub help page.
    -If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.
  • Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +If you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.

    Step 4. Create conflicting PRs.

    • [One member]: Update README: In the master branch, remove John Doe and Jane Doe from the README.md, commit, and push to the main repo.

    • [Each team member] Create a PR to add yourself under the Team Members section in the README.md. Use a new branch for the PR e.g., add-johnTan-name.

    Step 5. Merge conflicting PRs one at a time. Before merging a PR, you’ll have to resolve conflicts.

    • [Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.

    • [PR author] Resolve the conflict locally:

      1. Pull the master branch from the repo in your team org.
      2. Merge the pulled master branch to your PR branch.
      3. Resolve the merge conflict that crops up during the merge.
      4. Push the updated PR branch to your fork.
    • [Another member or the PR author]: Merge the de-conflicted PR: When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/print.page-vue-render.js b/se-book-adapted/print.page-vue-render.js index d3432909e0..37bbafe8cd 100644 --- a/se-book-adapted/print.page-vue-render.js +++ b/se-book-adapted/print.page-vue-render.js @@ -2714,6 +2714,6 @@ with(this){return _c('p',[_c('strong',[_v("Next, sync your local repos (and fork with(this){return _c('div',{staticClass:"indented-less"},[_c('div',[_c('p',[_v("You can follow the steps in the simulation of a forking workflow given below to learn how to follow such a workflow.")]),_v(" "),_c('p',[_c('span',[_c('span',{staticClass:"fas fa-info-circle",attrs:{"aria-hidden":"true"}})]),_v(" This activity is best done as a team.")]),_v(" "),_c('p',[_c('strong',[_v("Step 1. One member: set up the team org and the team repo.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['1.1)', '1.2)', '1.3)', '1.4)', '1.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.1)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/articles/creating-a-new-organization-from-scratch/"}},[_c('strong',[_v("Create a GitHub organization")])]),_v(" for your team, if you don't have one already. The org name is up to you. We'll refer to this organization as "),_c('em',[_v("team org")]),_v(" from now on.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.2)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/enterprise/2.10/admin/guides/user-management/creating-teams/"}},[_c('strong',[_v("Add a team")])]),_v(" called "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" to your team org.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.3)")]),_c('div',[_c('p',[_c('a',{attrs:{"href":"https://help.github.com/enterprise/2.0/admin/guides/user-management/adding-or-inviting-people-to-teams/"}},[_c('strong',[_v("Add team members")])]),_v(" to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" team.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.4)")]),_c('div',[_c('p',[_c('strong',[_v("Fork")]),_v(" "),_c('a',{attrs:{"href":"https://github.com/se-edu/samplerepo-workflow-practice"}},[_v("se-edu/samplerepo-workflow-practice")]),_v(" to your team org. We'll refer to this as the "),_c('em',[_v("team repo")]),_v(".")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("1.5)")]),_c('div',[_c('p',[_c('strong',[_c('a',{attrs:{"href":"https://help.github.com/articles/managing-team-access-to-an-organization-repository/"}},[_v("Add the forked repo")]),_v(" to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("developers")]),_v(" team.")]),_v(" Give write access.")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 2. Each team member: create PRs via own fork.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['2.1)', '2.2)', '2.3)', '2.4)', '2.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.1)")]),_c('div',[_c('p',[_c('strong',[_v("Fork that repo")]),_v(" from your team org to your own GitHub account.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.2)")]),_c('div',[_c('p',[_c('strong',[_v("Create a branch")]),_v(" named "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-{your name}-info")]),_v(" (e.g. "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-johnTan-info")]),_v(") in the local repo.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.3)")]),_c('div',[_c('p',[_c('strong',[_v("Add a file")]),_v(" "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("yourName.md")]),_v(" into the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("members")]),_v(" directory (e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("members/johnTan.md")]),_v(") containing some info about you into that branch.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.4)")]),_c('div',[_c('p',[_c('strong',[_v("Push that branch to your fork")]),_v(".")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("2.5)")]),_c('div',[_c('p',[_c('strong',[_v("Create a PR")]),_v(" from that branch to the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch of the team repo.")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 3. For each PR: review, update, and merge.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['3.1)', '3.2)', '3.3)', '3.4)', '3.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.1)")]),_c('div',[_c('p',[_c('strong',[_v("[A team member (not the PR author)] Review the PR")]),_v(" by adding comments (can be just dummy comments).")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.2)")]),_c('div',[_c('p',[_c('strong',[_v("[PR author] Update the PR")]),_v(" by pushing more commits to it, to simulate updating the PR based on review comments.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.3)")]),_c('div',[_c('p',[_c('strong',[_v("[Another team member] Approve and merge")]),_v(" the PR using the GitHub interface.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("3.4)")]),_c('div',[_c('p',[_c('strong',[_v("[All members]")]),_v(" "),_c('a',{attrs:{"href":"https://help.github.com/articles/syncing-a-fork/"}},[_c('strong',[_v("Sync your local repo (and your fork)")]),_v(" with upstream repo")]),_v(". In this case, your "),_c('em',[_v("upstream repo")]),_v(" is the repo in your team org.")]),_v(" "),_c('ul',[_c('li',[_v("The basic mechanism for this has two steps (which you can do using Git CLI or any Git GUI):"),_c('br'),_v("\n(1) First, pull from the upstream repo -- this will update your clone with the latest code from the upstream repo."),_c('br'),_v("\nIf there are any unmerged branches in your local repo, you can update them too e.g., you can merge the new "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to each of them."),_c('br'),_v("\n(2) Then, push the updated branches to your fork. This will also update any PRs from your fork to the upstream repo.")]),_v(" "),_c('li',[_v("Some alternatives mechanisms to achieve the same can be found in "),_c('a',{attrs:{"href":"https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork"}},[_v("this GitHub help page")]),_v("."),_c('br'),_v("\nIf you are new to Git, we recommend that you use the above two-step mechanism instead, so that you get a better view of what's actually happening behind the scene.")])])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 4. Create conflicting PRs.")])]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['4.1)', '4.2)', '4.3)', '4.4)', '4.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("4.1)")]),_c('div',[_c('p',[_c('strong',[_v("[One member]: Update README:")]),_v(" In the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch, remove John Doe and Jane Doe from the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(", commit, and push to the main repo.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("4.2)")]),_c('div',[_c('p',[_c('strong',[_v("[Each team member] Create a PR")]),_v(" to add yourself under the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("Team Members")]),_v(" section in the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("README.md")]),_v(". Use a new branch for the PR e.g., "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("add-johnTan-name")]),_v(".")])])])]),_v(" "),_c('p',[_c('strong',[_v("Step 5. Merge conflicting PRs")]),_v(" one at a time. Before merging a PR, you’ll have to resolve conflicts.")]),_v(" "),_c('ul',{staticStyle:{"list-style-type":"none","padding-inline-start":"0px"}},[_c('li',{staticStyle:{"display":"flex"},attrs:{"texts":"['5.1)', '5.2)', '5.3)', '5.4)', '5.5)']"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.1)")]),_c('div',[_c('p',[_v("[Optional] A member can inform the PR author (by posting a comment) that there is a conflict in the PR.")])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.2)")]),_c('div',[_c('p',[_c('strong',[_v("[PR author] Resolve the conflict locally")]),_v(":")]),_v(" "),_c('ol',[_c('li',[_v("Pull the "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch from the repo in your team org.")]),_v(" "),_c('li',[_v("Merge the pulled "),_c('code',{pre:true,attrs:{"class":"line-numbers hljs inline no-lang"}},[_v("master")]),_v(" branch to your PR branch.")]),_v(" "),_c('li',[_v("Resolve the merge conflict that crops up during the merge.")]),_v(" "),_c('li',[_v("Push the updated PR branch to your fork.")])])])]),_v(" "),_c('li',{staticStyle:{"display":"flex"}},[_c('span',{staticStyle:{"line-height":"unset","margin-inline-end":"0.35em","align-self":"flex-start","flex-shrink":"0"},attrs:{"aria-hidden":"true"}},[_v("5.3)")]),_c('div',[_c('p',[_c('strong',[_v("[Another member or the PR author]: Merge the de-conflicted PR")]),_v(": When GitHub does not indicate a conflict anymore, you can go ahead and merge the PR.")])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file diff --git a/se-book-adapted/projectDuke/index.html b/se-book-adapted/projectDuke/index.html index e8811e0b8d..21491aac58 100644 --- a/se-book-adapted/projectDuke/index.html +++ b/se-book-adapted/projectDuke/index.html @@ -755,7 +755,7 @@ You can select a theme too.
  • Go to https://{your username}.github.io/{repo name}/ to view the user guide of your product. Note: it could take 5-10 minutes for GitHub to update the page.
    It is important that you carefully check the content of the UG available at the above URL to ensure the HTML version of the page (auto-generated by GitHub Pages, based on your Markdown text) has the right content. In some rare cases, the page might look alright on GitHub file preview but will not render correctly on GitHub pages.
  • Minimal:

    • Ensure the chatbot name is stated clearly at the top of the User Guide.
    • Provide the reader with enough guidance to be able to use all important features of your chatbot.

    How detailed should the user guide be? It should be fit-for-purpose. i.e., think from the user's point of view and include as much information as necessary for the user (while trying to keep it as short as possible -- users don't have the patience to read lengthy user guides either), in a format as friendly to the user as possible.
    You can use the 'Features' section of this user guide as a benchmark.


    A-DevGuide

    Add a Developer Guide

    Add a Developer Guide to the project, explaining the design and implementation to future developers.


    A-Release

    Release the product

    Release the product to be used by potential users. e.g., you can make it available on GitHub


    A-BetterGui

    Improve the GUI

    Improve the GUI to make it more polished. Some examples:

    • Tweak the GUI to match the asymmetric nature of the conversation: As the conversation is between the user and the app (not between two humans), it is asymmetric in nature. Accordingly, it makes sense not to display both sides of the conversion in the same visual format.
    • Highlight errors e.g., when the user types a wrong command, the error should be shown in a different format to catch ther user's attention.
    • Tweak padding, fonts, colors, alignments to make the GUI more pleasing to look at.
      Given the app is likely to take only a small portion of the screen, and the bot replies can contain lot of text, try to optimize for space (e.g., avoid wasting display space that simply shows the background graphics).
    • Allow resizing of the Window, and ensure the content resize appropriately as the Window changes size.
    • Profile pictures: If your GUI shows profile pictures, you can tweak the way the picture is shown (e.g., crop as a circle or a square with rounded corners). In fact, an easy tweak is to use a picture with a transparent background so that it blends nicely with the background.
      -Given that the participants of the conversion are fixed (i.e., you and the chatbot), do you even need big profile pictures?
    • Focus more on tweaks that actually improves the user experience (UX). Some changes (e.g., profile pictures, background graphics) can be eye catching but can even degrade the UX if not done right (e.g., it can make the text harder to read)

    You can take inspiration from these past projects. If you adopt any ideas from them, don't forget to give credit to the original author.

    A-Personality

    Give a unique personality

    Choose a unique personality for Duke, and tweak the following aspects to go with that personality:

    • Name
    • Phrases used by Duke (e.g., when responding to a command)
    • GUI (colors, icons, font, etc.)

    A-MoreTesting

    More automated tests

    Write more JUnit tests, to test nearly all code that can be tested automatically.

    You may omit code that are hard to test automatically e.g., GUI functionality (test those manually instead).

    This can include more manual testing as well e.g., testing on different OSes, different screen resolution, different OS language settings (English vs Chinese)

    A-MoreErrorHandling

    More error handling

    Improve the code to handle all errors you anticipate the product will encounter during usage.

    Some examples of errors:

    • command format errors: multiple spaces where only one is expected, trailing/leading spaces in the command, an essential parameter missing, a parameter is specified multiple times, special characters used where they are not expected, ...
    • environment issues: an expected file is missing, access to a file is denied, a file content is not as expected, ...
    • data is not as expected: start date/time is later (or same as) than end/time, a value that should be unique is duplicated (e.g., two tasks with the same exact details), non-existent dates (e.g., Feb 30)

    A-AiAssisted

    Enhance the code using AI tools

    Use AI tools (e.g., GitHub Copilot, ChatGPT) to enhance your chatbot code. For example, you can get AI tools to help you,

    • improve the quality of the current code.
    • tweak an existing feature to make it more useful to the user.
    • add or improve documentation, tests.

    Extensions: Category B

    B-TentativeScheduling

    Tentative scheduling

    Provide a way for an event to be tentatively scheduled in multiple slots, and later to be confirmed to one the slots.


    B-Snooze

    Snoozing/postponing tasks

    Provide a way to easily snooze/postpone/reschedule tasks.


    B-RecurringTasks

    Recurring tasks

    Provide support for managing recurring tasks e.g., a weekly project meeting.


    B-DoAfterTasks

    'Do after' tasks

    Support the managing of tasks that need to be done after a specific time/task e.g., return book after the exam is over.


    B-DoWithinPeriodTasks

    'Do within a period' task

    Provide support for managing tasks that need to be done within a certain period e.g., collect certificate between Jan 15 and 25th.


    B-FixedDurationTasks

    Unscheduled tasks with a fixed duration

    Provide support for managing tasks that takes a fixed amount of time but does not have a fixed start/end time e.g., reading the sales report (needs 2 hours).


    B-Reminders

    Reminders for tasks

    Provide a way to get reminders about tasks e.g., remind the user about upcoming deadlines.


    B-FindFreeTimes

    Find free times

    Provide a way for the user to find free times e.g., when is the nearest day in which I have a 4 hour free slot?.


    B-ViewSchedules

    View schedules

    Provide a way to view tasks in the form of a schedule e.g., view the schedule for a specific date.


    B-DetectAnomalies

    Detect scheduling anomalies

    Deal with schedule anomalies e.g., detect if a task being added clashes with another task in the list.

    Extensions: Category C

    C-DetectDuplicates

    Deal duplicate items

    Add the ability to recognize and deal with duplicate items. e.g., the same task added multiple times.


    C-FlexibleDataSource

    Flexible data source

    Provide more flexibility with the data source e.g., the ability for the user to specify which file to use as the data source.


    C-Sort

    Sorting items managed by the App

    The ability to sort items e.g., sort deadlines chronologically.

    C-NaturalDates

    More natural date formats

    Support more natural date formats e.g., Mon in a user command can be interpreted as the date of the next Monday in the calendar.

    C-BetterSearch

    More flexibility in searching for items

    All more flexibility in search e.g., find items even if the keyword matches the item only partially.

    C-Update

    Easily edit items

    Support a way to easily edit details of items e.g., change the end time of an event without changing anything else.

    Minimal: the ability to update an existing item without having to delete it first

    Other ideas:

    • the ability to clone items (to easily create new items based on existing items)

    C-Tagging

    Tagging items

    Provide a way to tag items e.g., tag a task as #fun.

    C-Priority

    Prioritizing items

    Provide a way to attach priorities to items e.g., mark an item as a high priority (or priority level 1).

    C-Archive

    Archiving items

    Provide a way to archive items so that the user can remove items from the app but still keep a record of them somewhere e.g., archive all tasks in the list into a file so that the user can start over with a clean slate.

    C-MassOps

    Mass operations

    Provide a way to perform tasks on multiple items e.g., delete some specific items in one go.

    C-Statistics

    Statistics and insights

    Provide a way to leverage statistics about the items managed by the App e.g., show the number of tasks that have been completed in the past week.

    C-Undo

    Undo

    Provide a way to undo a command.

    Minimal: the ability to undo the most recent command.

    C-Help

    Give help to users

    Provide in-App guidance to users.

    Minimal: add a command to access a help page.

    Other ideas:

    • Load the App with some sample data at the first run.

    C-FriendlierSyntax

    Friendlier syntax for commands

    Make the command syntax more flexible.

    Minimal: provide shorter aliases for keywords e.g., t can be shorter alias for todo.

    Other ideas:

    • Allow users to define their own aliases
    • Remove the need for the parts of a command to be in a specific order

    Extensions: Category D

    D-Contacts

    Support managing contacts

    Support managing info about contacts e.g., details of friends

    D-Notes

    Support managing notes

    Support managing info about small snippets of textual information the user wants to record e.g., one's own waist size, a name of a movie that the user wants to remember

    D-Expenses

    Support managing expenses

    Support managing info about expenses e.g., the amounts spent on food, books, transport, etc.

    D-Loans

    Support managing loan records

    Support keeping records of loans given/taken e.g., money lent/owed to colleagues/friends

    D-Places

    Support managing info about places

    Support recording info about places e.g., info about restaurants visited, for future reference

    D-Trivia

    Support managing trivia

    Provide the ability to learn/memorize things e.g., learn vocabulary, answers to questions

    D-Clients

    Support managing client info

    Support managing info about clients e.g., for an insurance agent to keep track of clients

    D-Merchandise

    Support managing merchandise info

    Support managing info about merchandise e.g., a property agent to keep track of properties, a collector of stamps keep track of items in the collection

    [Powered by MarkBind 5.5.3, generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]
    +Given that the participants of the conversion are fixed (i.e., you and the chatbot), do you even need big profile pictures?
  • Focus more on tweaks that actually improves the user experience (UX). Some changes (e.g., profile pictures, background graphics) can be eye catching but can even degrade the UX if not done right (e.g., it can make the text harder to read)
  • You can take inspiration from these past projects. If you adopt any ideas from them, don't forget to give credit to the original author.

    A-Personality

    Give a unique personality

    Choose a unique personality for Duke, and tweak the following aspects to go with that personality:

    • Name
    • Phrases used by Duke (e.g., when responding to a command)
    • GUI (colors, icons, font, etc.)

    A-MoreTesting

    More automated tests

    Write more JUnit tests, to test nearly all code that can be tested automatically.

    You may omit code that are hard to test automatically e.g., GUI functionality (test those manually instead).

    This can include more manual testing as well e.g., testing on different OSes, different screen resolution, different OS language settings (English vs Chinese)

    A-MoreErrorHandling

    More error handling

    Improve the code to handle all errors you anticipate the product will encounter during usage.

    Some examples of errors:

    • command format errors: multiple spaces where only one is expected, trailing/leading spaces in the command, an essential parameter missing, a parameter is specified multiple times, special characters used where they are not expected, ...
    • environment issues: an expected file is missing, access to a file is denied, a file content is not as expected, ...
    • data is not as expected: start date/time is later (or same as) than end/time, a value that should be unique is duplicated (e.g., two tasks with the same exact details), non-existent dates (e.g., Feb 30)

    A-AiAssisted

    Enhance the code using AI tools

    Use AI tools (e.g., GitHub Copilot, ChatGPT) to enhance your chatbot code. For example, you can get AI tools to help you,

    • improve the quality of the current code.
    • tweak an existing feature to make it more useful to the user.
    • add or improve documentation, tests.

    Extensions: Category B

    B-TentativeScheduling

    Tentative scheduling

    Provide a way for an event to be tentatively scheduled in multiple slots, and later to be confirmed to one the slots.


    B-Snooze

    Snoozing/postponing tasks

    Provide a way to easily snooze/postpone/reschedule tasks.


    B-RecurringTasks

    Recurring tasks

    Provide support for managing recurring tasks e.g., a weekly project meeting.


    B-DoAfterTasks

    'Do after' tasks

    Support the managing of tasks that need to be done after a specific time/task e.g., return book after the exam is over.


    B-DoWithinPeriodTasks

    'Do within a period' task

    Provide support for managing tasks that need to be done within a certain period e.g., collect certificate between Jan 15 and 25th.


    B-FixedDurationTasks

    Unscheduled tasks with a fixed duration

    Provide support for managing tasks that takes a fixed amount of time but does not have a fixed start/end time e.g., reading the sales report (needs 2 hours).


    B-Reminders

    Reminders for tasks

    Provide a way to get reminders about tasks e.g., remind the user about upcoming deadlines.


    B-FindFreeTimes

    Find free times

    Provide a way for the user to find free times e.g., when is the nearest day in which I have a 4 hour free slot?.


    B-ViewSchedules

    View schedules

    Provide a way to view tasks in the form of a schedule e.g., view the schedule for a specific date.


    B-DetectAnomalies

    Detect scheduling anomalies

    Deal with schedule anomalies e.g., detect if a task being added clashes with another task in the list.

    Extensions: Category C

    C-DetectDuplicates

    Deal duplicate items

    Add the ability to recognize and deal with duplicate items. e.g., the same task added multiple times.


    C-FlexibleDataSource

    Flexible data source

    Provide more flexibility with the data source e.g., the ability for the user to specify which file to use as the data source.


    C-Sort

    Sorting items managed by the App

    The ability to sort items e.g., sort deadlines chronologically.

    C-NaturalDates

    More natural date formats

    Support more natural date formats e.g., Mon in a user command can be interpreted as the date of the next Monday in the calendar.

    C-BetterSearch

    More flexibility in searching for items

    All more flexibility in search e.g., find items even if the keyword matches the item only partially.

    C-Update

    Easily edit items

    Support a way to easily edit details of items e.g., change the end time of an event without changing anything else.

    Minimal: the ability to update an existing item without having to delete it first

    Other ideas:

    • the ability to clone items (to easily create new items based on existing items)

    C-Tagging

    Tagging items

    Provide a way to tag items e.g., tag a task as #fun.

    C-Priority

    Prioritizing items

    Provide a way to attach priorities to items e.g., mark an item as a high priority (or priority level 1).

    C-Archive

    Archiving items

    Provide a way to archive items so that the user can remove items from the app but still keep a record of them somewhere e.g., archive all tasks in the list into a file so that the user can start over with a clean slate.

    C-MassOps

    Mass operations

    Provide a way to perform tasks on multiple items e.g., delete some specific items in one go.

    C-Statistics

    Statistics and insights

    Provide a way to leverage statistics about the items managed by the App e.g., show the number of tasks that have been completed in the past week.

    C-Undo

    Undo

    Provide a way to undo a command.

    Minimal: the ability to undo the most recent command.

    C-Help

    Give help to users

    Provide in-App guidance to users.

    Minimal: add a command to access a help page.

    Other ideas:

    • Load the App with some sample data at the first run.

    C-FriendlierSyntax

    Friendlier syntax for commands

    Make the command syntax more flexible.

    Minimal: provide shorter aliases for keywords e.g., t can be shorter alias for todo.

    Other ideas:

    • Allow users to define their own aliases
    • Remove the need for the parts of a command to be in a specific order

    Extensions: Category D

    D-Contacts

    Support managing contacts

    Support managing info about contacts e.g., details of friends

    D-Notes

    Support managing notes

    Support managing info about small snippets of textual information the user wants to record e.g., one's own waist size, a name of a movie that the user wants to remember

    D-Expenses

    Support managing expenses

    Support managing info about expenses e.g., the amounts spent on food, books, transport, etc.

    D-Loans

    Support managing loan records

    Support keeping records of loans given/taken e.g., money lent/owed to colleagues/friends

    D-Places

    Support managing info about places

    Support recording info about places e.g., info about restaurants visited, for future reference

    D-Trivia

    Support managing trivia

    Provide the ability to learn/memorize things e.g., learn vocabulary, answers to questions

    D-Clients

    Support managing client info

    Support managing info about clients e.g., for an insurance agent to keep track of clients

    D-Merchandise

    Support managing merchandise info

    Support managing info about merchandise e.g., a property agent to keep track of properties, a collector of stamps keep track of items in the collection

    [Powered by MarkBind 5.5.3, generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]
    diff --git a/se-book-adapted/projectDuke/index.page-vue-render.js b/se-book-adapted/projectDuke/index.page-vue-render.js index b6f558472b..099f0bcce7 100644 --- a/se-book-adapted/projectDuke/index.page-vue-render.js +++ b/se-book-adapted/projectDuke/index.page-vue-render.js @@ -566,6 +566,6 @@ with(this){return _c('h3',{attrs:{"id":"d-merchandise"}},[_c('span',{staticClass with(this){return _c('p',[_v("Support managing info about merchandise "),_c('span',{staticClass:"dimmed"},[_v("e.g., a property agent to keep track of properties, a collector of stamps keep track of items in the collection")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Mon, 4 Nov 2024, 23:57:27 GMT+8]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.3")]),_v(", generated on Tue, 5 Nov 2024, 15:21:43 GMT+8]")])])])} }]; \ No newline at end of file